قابلیت برگشت پذیری از فرگمنت اجرا شده به صفحه main activity با استفاده از دکمه های برگشت سخت افزاری اندروید
مدیریت گفتگو
سلام.
من یک برنامه دارم که از طریق منو به فرگمنت هایی که تعریف کردم داخل میشم.
اما وقتی میخوام دکمه برگشت دستگاهمو بزنم از برنامه خارج میشه.
من میخوام دکمه back دستگاه خاصیت برگشت بگیره.
پاسخها 23
منظورتون اینه که به اکتیویتی قبلی بره؟ ( در 9 دقیقه پیش ) بله(دقیقا) اما با کلیدهای سخت افزاری اندروید(یا همان نوار وظیفه مشکی رنگ)
نظرات
متد onBackPressed رو توی اکتیویتی اورراید کنید یا کد زیر رو توی اکتیویتی کپی کنید:
@Override
public void onBackPressed() {
// your Code
super.onBackPressed();
}
حالا شما دکمه ی برگشت رو در اختیار دارید و می تونید به جای your code مثلا بگید که فرگمنت remove بشه.
نظرات
من این کد رو نمیتونم داخل فرگمنت استفاده کنم خب
این کد فرگمنت منه:
package sliding_tabhost;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import soft.kaziwa.com.nab.R;
public class Tab1 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v =inflater.inflate(R.layout.activity_search,container,false);
WebView webView=(WebView) v.findViewById(R.id.webView11);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient());
webView.loadUrl("http://google.com");
return v;
}
}
اگه میشه توی این فرگمنت تعریف کن
نظرات
این فرگمنتیه که داخلشم و میخوام به فرگمنت قبلی یا اکتیویتی صفحه اول با استفاده از دکمه بک برگردم
نظرات
اگه مجموعه فرگمنت هایی که با استفاده از منو اونهارو نمایش میدید رو در یک اکتیویتی جدید قرار دادید میتونید این اکتیویتی رو در متد onBackPressed کلا ببندیدش...
@Override
public void onBackPressed() {
this.finish();
}
اگه میخواید با زدن دکمه بک به فرگمنت هایی که قبلا نمایش داده شدن برگردید ، در کلاس اکتیویتی (یا فرگمنت) پدرِ این فرگمنت ها که توش FragmentManager و FragmentTransaction رو ساختید ، متد زیر رو روی fragmentTransaction صدا بزنید :
ft.addTobackStack(null);
نظرات
دوست من این فرگمنت من در داخل کلاس اصلی برناممه
Tab1 fragment1 = new Tab1();
android.support.v4.app.FragmentTransaction fragmentTransaction1 = getSupportFragmentManager().beginTransaction();
fragmentTransaction1.replace(R.id.frame, fragment1);
fragmentTransaction1.commit();
نظرات
دوست من این فرگمنت من در داخل کلاس اصلی برناممه
Tab1 fragment1 = new Tab1();
android.support.v4.app.FragmentTransaction fragmentTransaction1 = getSupportFragmentManager().beginTransaction();
fragmentTransaction1.replace(R.id.frame, fragment1);
fragmentTransaction1.commit();
اینم کد فرگمنتم که از طریق متد بالا واردش میشه
package sliding_tabhost;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import soft.kaziwa.com.nab.R;
publicclassTab1extendsFragment{
@Override
publicView onCreateView(LayoutInflater inflater,@NullableViewGroup container,@NullableBundle savedInstanceState){
View v =inflater.inflate(R.layout.activity_search,container,false);
WebView webView=(WebView) v.findViewById(R.id.webView11);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(newWebViewClient());
webView.loadUrl("http://google.com");
return v;
}
}
اگه میشه روی این کدها توضیح بده
نظرات

نظرات
نظرات
الان کد من ایراد داره؟؟؟
case R.id.search:
ConnectivityManager connectivityManager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = connectivityManager.getActiveNetworkInfo();
if (netInfo == null) {
Toast.makeText(getApplicationContext(), "اوه!!اینترنت نداری!!!", Toast.LENGTH_LONG).show();
}
else {
Tab1 fragment1 = new Tab1();
android.support.v4.app.FragmentTransaction fragmentTransaction1 = getSupportFragmentManager().beginTransaction();
fragmentTransaction1.replace(R.id.frame, fragment1);
fragmentTransaction1.addToBackStack(null);
fragmentTransaction1.commit();
}
return true;
بازم دکمه برگشت گوشیمو میزنم میاد بیرون
نظرات
توی این حالت با کلیک روی بک از اپلیکیشن خارج میشه:
getSupportFragmentManager().beginTransaction()
.add(R.id.container,new WalkThroughFragment(),"WALK_THROUGH_FRAGMENT")
.commit();
توی این حالت فرگمنت بسته میشه و اکتیویتی زیرش نمایان میشه:
getSupportFragmentManager().beginTransaction()
.add(R.id.container,new WalkThroughFragment(),"WALK_THROUGH_FRAGMENT")
.addToBackStack("WALK_THROUGH_FRAGMENT")
.commit();
توجه: هیچ وقت اون تگ هایی که من پر کردم رو خالی یا null نذارید، اون بنده خدایی که اینارو نوشته حتما یه دلیلی داشته. در صورتی که بخواید بعدا به اون فرگمنت دسترسی داشته باشید: شامل دسترسی به متدها، حذف فرگمنت، حذف از حافظه یا ...، میتونید از اون تگ استفاده کنید.
قابل توجه دوستانی که گفتن از onBackPressed استفاده کن:
متد onBackPressed فقط توی اکتیویتی کار میکنه، میتونه کاربردای زیادی توی مدیریت فرگمنت ها داشته باشه ولی روش استفادش به این صورته که شما توی اکتیویتی که فرگمنت توی اون ساخته شده این متد رو مینویسی، بعد باید تشخیص بدی که الان توی کدوم فرگمنتی و باید یک اینستنس از اون فرگمنتی که توش هستی بسازی و به متدهاش دسترسی پیدا کنی. هیچ وقت نمیتونید onBackPressed رو توی فرگنمت داشته باشید مگر اینکه لیستنر یا Broadcast خودتون رو براش بسازید.
نظرات
ممنون دوست من-خیلی توضیحات کاملی بود-اما بخدا من خیلی آماتورم.این کدی که دادی رو گذاشتم.اما نمیدونم چیکار باید بکنم!!!
این عکس اندروید استودیو-کد ها بالای توضیحات شما هم تایپ شده.فقط تورو خدا کمکم کنین تا راه بیفتم-توو این روزای عزیز دعاتون میکنم

نظرات
سلام. من پاسخ رو صبح درج کردم ولی نگاه نکردم ببینم درج شده یا نه، گویا نت قطع بوده یا ...
کافیه کد توی قسمت else که کد زیر هست
Tab1 fragment1 = new Tab1(); android.support.v4.app.FragmentTransaction fragmentTransaction1 = getSupportFragmentManager().beginTransaction(); fragmentTransaction1.replace(R.id.frame, fragment1); fragmentTransaction1.addToBackStack(null); fragmentTransaction1.commit();
رو به کد زیر تغییر بدید
getSupportFragmentManager().beginTransaction()
.add(R.id.frame,new Tab1(),"TAB1_FRAGMENT")
.addToBackStack("TAB1_FRAGMENT")
.commit();
نظرات
این چه طلسمیه.نشد بازم
case R.id.search:
ConnectivityManager connectivityManager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = connectivityManager.getActiveNetworkInfo();
if (netInfo == null) {
Toast.makeText(getApplicationContext(), "اوه!!اینترنت نداری!!!", Toast.LENGTH_LONG).show();
}
else {
getSupportFragmentManager().beginTransaction()
.add(R.id.frame,new Tab1(),"TAB1_FRAGMENT")
.addToBackStack("TAB1_FRAGMENT")
.commit();
}
return true;
نظرات
دوست عزیز فکر کنم منطق قضیه یکم گنگه برات هنوز.
با اضافه کردن addToBackStack شما قابلیت های زیر رو به فرگمنت اضافه میکنی:
حساس شدن به کلید بک گوشی. (بدین معنی که اگر فرگمنت A رو باز کنی بعد به فرگمنت B بری و بعد دکمه بک رو بزنی، فرگمنت B بسته میشه و فرگمنت A نمایش داده میشه)
اضافه شدن به مموری و قرارگیری در BackStack. (برای هندل کردن فرگمنت و استفاده ازش یا پیدا کردنش توی فرگمنت های دیگر استفاده داره)
و قابلیت های دیگه که به این پست مربوط نمیشن.
ولی اگر addToBackStack نزنی و تگ ست نکنی چه اتفاقی می افته؟
اگر فرگمنت A رو باز کنی بعد به فرگمنت B بری و دکمه بک رو بزنی، اکتیویتی بسته میشه (و تمام فرگمنت های درونش). اگر فرگمنت A رو addToBackStack نزنی و فرگمنت B رو بزنی. با کلیک روی بک فرگمنت B بسته میشه و فرگمنت A میمونه.
روشی که میتونید انجام بدید:
به صورتی که بالا گفتم. اولین فرگمنتی که توی اکتیویتی باز میکنی رو addToBackStack ست نکنی براش ولی تمام فرگمنت های دیگه رو ست کنی. با اینکار از هر فرگمنتی که دکمه بک رو بزنی همون اولی نمایش داده میشه. اولی رو ست نمیکنیم چون اگر اون بسته بشه، اکتیویتی هم باید بسته بشه.
یک مشکل دیگه هم که شما داری اینه که توی اکتیویتی، توی متد onBackPressed نوشتی توست نشون بده و با دوبار کلیک از برنامه خارج شه. مشکل اینجاست که شما اول باید چک کنی که آیا فرگمنتی که روی صفحه هست همون اولین فرگمنته یا نه. مثلا اگر فرگمنت B بود نباید کاری بکنه ولی اگر A بود باید توست نمایش بدی.
برای انجام اینکار شرط زیر رو توی اکتیویتی بنویس و بعد کدهای توست و خارج شدن رو توی اینا قرار بده
Fragment fragment = getSupportFragmentManager().findFragmentByTag("FRAGMENT_A");
if (fragment.getTag() != null && !fragment.isHidden() && fragment.isVisible()) {
// Toast
// exit app if its second time that user click on Back Button
}
من سید نیستم دوست عزیز.
موفق باشی.
نظرات
هرچی ازت تشکر کنم کمه بخدا.
دست مریزاد-ینی شیر مادرت حلالت الحق که استادی داداش
یه هفته بود فلج بودم.بال درآوردم رفیق
درسته کد توست برگشتمو برداشتم درست شد
این کد برگشت منه
private boolean doubleBackToExitPressedOnce = false;
@Override
public void onBackPressed() {
if (doubleBackToExitPressedOnce) {
super.onBackPressed();
return;
}
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, "جهت خروج مجدد دکمه بازگشت را بفشارید",
Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
doubleBackToExitPressedOnce=false;
}
}, 2000);
}
نظرات
اون بالاییارو پاک کن اینارو بنویس
@Override
public void onBackPressed() {
Fragment fragment = getSupportFragmentManager().findFragmentByTag("FRAGMENT_A");
if (fragment.getTag() != null && !fragment.isHidden() && fragment.isVisible()) {
exitApplication();
} else {
super.onBackPressed();
}
}
private boolean doubleBackToExitPressedOnce;
private void exitApplication() {
if (doubleBackToExitPressedOnce) {
super.onBackPressed();
return;
}
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, "Click To Exit", Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
doubleBackToExitPressedOnce = false;
}
}, 5000);
}
فقط من نوشتم FRAGMENT_A شما باید تگی که زمان ساخت فرگمنت اولت بهش میدی رو بزنی.
برای تشکر هم لایک کافیه دوست من ;)
نظرات
ببین من این کد رو داخل اگتیویتی اصلیم گذاشته بودم-توضیحات شما کمی برای من گیج کنندست
جای این کد رو باید عوض کنم؟؟؟
یا برای هرگزینه یک کد خروج تعریف کنم؟
نظرات
این کد های زیر رو پاک کن
private boolean doubleBackToExitPressedOnce = false;
@Override
public void onBackPressed() {
if (doubleBackToExitPressedOnce) {
super.onBackPressed();
return;
}
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, "جهت خروج مجدد دکمه بازگشت را بفشارید",
Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
doubleBackToExitPressedOnce=false;
}
}, 2000);
}
و اینارو جایگزین کن
@Override
public void onBackPressed() {
Fragment fragment = getSupportFragmentManager().findFragmentByTag("FRAGMENT_A");
if (fragment.getTag() != null && !fragment.isHidden() && fragment.isVisible()) {
exitApplication();
} else {
super.onBackPressed();
}
}
private boolean doubleBackToExitPressedOnce;
private void exitApplication() {
if (doubleBackToExitPressedOnce) {
super.onBackPressed();
return;
}
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, "Click To Exit", Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
doubleBackToExitPressedOnce = false;
}
}, 5000);
}
نظرات
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .

نظرات