簡體   English   中英

go 按返回時返回第一個片段

[英]go back to first fragment when press back

例如,當我在 Fragment 5 中按下返回按鈕時,應用程序就會出現。 我想要的是當我按下后退按鈕時,我打開第 1 號片段。我該怎么做?

我嘗試了很多代碼,但它不起作用,比如

FragmentManager fm = getActivity().getSupportFragmentManager();
 for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {
    fm.popBackStack();
}

getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

這是我在 MainActivity 中的片段代碼

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // make new object and find the view "BottomNavigationView"
    BottomNavigationView navigationView = findViewById(R.id.bottom_navigation);
    // To make the first fragment shows when the app start.
    // We will ignore the "activity_main" and we will make new activity(fragment) called "fragment_home"
    // and we will add all views we want to display them on it.
    // (fragment_layout) it is a fragment have id was defined in "activity_main"
    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_layout,
            new HomeFragment()).commit();
    // make Listener to call the fragments on buttons
    // to start new fragment
    navigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            Fragment selectedFragment = null;
            switch (item.getItemId()) {
                // first fragment "home"
                case R.id.home_item:
                    selectedFragment = new HomeFragment();
                    break;
                // second fragment "videos"
                case R.id.videos_item:
                    selectedFragment = new VideosFragment();
                    break;
                // third fragment "ebadat"
                case R.id.ebadat_item:
                    selectedFragment = new EbadatFragment();
                    break;
                // fourth fragment "images"
                case R.id.images_item:
                    selectedFragment = new ImagesFragment();
                    break;
                // fifth fragment "more"
                case R.id.settings_item:
                    selectedFragment = new MoreFragment();
                    break;
            }
            assert selectedFragment != null;
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_layout, selectedFragment).commit();
            return true;
        }

    });
}

添加 onBackPressed 方法:

@Override
public void onBackPressed() {
    //super.onBackPressed(); delete this line 
    // and start your fragment:

    NextFragment nextFrag= new NextFragment();
    getActivity().getSupportFragmentManager().beginTransaction()
         .replace(R.id.Layout_container, nextFrag, "findThisFragment")
         .addToBackStack(null)
         .commit();
}

首先,您必須在 Fragment 中實現 onBackPressed 方法。

  1. 創建一個名為 IOnBackPressed 的界面:單擊 package -> new Java Class -> 並選擇界面類型 -> 確定您的界面應如下所示:

     public interface IOnBackPressed { boolean onBackPressed(); }
  2. 之后,您打開 MainActivity 並添加以下內容:

     @Override public void onBackPressed() { //super.onBackPressed(); delete this line // and start your fragment: Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container); if (.(fragment instanceof IOnBackPressed) ||.((IOnBackPressed) fragment);onBackPressed()) { super.onBackPressed(); } }
  3. 你實現這個到你的片段:

     public class Profil_Fragment extends Fragment implements IOnBackPressed

    並將其添加到片段中:

     @Override public boolean onBackPressed() { //do what you want NextFragment nextFrag= new NextFragment(); getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, nextFrag, "findThisFragment").addToBackStack(null).commit(); return true; }

添加 backstack 和標簽(您可以使用像“HomeFragment”這樣的片段名稱)來替換片段。

replace(fragmentId, fragment, fragmentName).addToBackStack(fragmentName)

和這樣的流行片段

popBackStack(fragmentName,0)

嘗試添加 transaction.addToBackStack(tag);

例如:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragment_layout, selectedFragment);
ft.addToBackStack( "tag" ).commit();

這會將您的片段添加到后台堆棧,以便后退按鈕可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM