简体   繁体   English

在片段中显示和使用“后退”按钮

[英]Display and use Back button in fragment

 public class NewFrag extends Fragment{ @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true); setHasOptionsMenu(true); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.newfrag, container, false); } } 

 public class PrimaryFragment extends Fragment { Button btn1; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.primary, container, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); btn1 = (Button)view.findViewById(R.id.btn1); btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Fragment var1 = new NewFrag(); ((MainActivity)getActivity()).replaceFragment(var1); } }); } } 
 public class TabFragment extends Fragment { public static TabLayout tabLayout; public static ViewPager viewPager; public static int int_items = 2 ; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.tab_layout, container, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); tabLayout = (TabLayout) view.findViewById(R.id.tabs); viewPager = (ViewPager) view.findViewById(R.id.viewpager); viewPager.setAdapter(new MyAdapter(getChildFragmentManager())); tabLayout.post(new Runnable() { @Override public void run() { tabLayout.setupWithViewPager(viewPager); } }); } class MyAdapter extends FragmentPagerAdapter { public MyAdapter(FragmentManager fm) { super(fm); } /** * Return fragment with respect to Position . */ @Override public Fragment getItem(int position) { switch (position){ case 0 : return new PrimaryFragment(); case 1 : return new SocialFragment(); } return null; } @Override public int getCount() { return int_items; } /** * This method returns the title of the tab according to the position. */ @Override public CharSequence getPageTitle(int position) { switch (position){ case 0 : return "Primary"; case 1 : return "Social"; } return null; } } } 
 public class MainActivity extends AppCompatActivity{ DrawerLayout mDrawerLayout; NavigationView mNavigationView; ActionBarDrawerToggle mDrawerToggle; FragmentManager mFragmentManager; FragmentTransaction mFragmentTransaction; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /** *Setup the DrawerLayout and NavigationView */ mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout); mNavigationView = (NavigationView) findViewById(R.id.shitstuff) ; /** * Lets inflate the very first fragment * Here , we are inflating the TabFragment as the first Fragment */ mFragmentManager = getSupportFragmentManager(); mFragmentTransaction = mFragmentManager.beginTransaction(); mFragmentTransaction.replace(R.id.containerView,new TabFragment()).addToBackStack(null).commit(); /** * Setup click events on the Navigation View Items. */ mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { mDrawerLayout.closeDrawers(); if (menuItem.getItemId() == R.id.nav_item_inbox) { FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.containerView,new NavOne()).addToBackStack(null).commit(); } if (menuItem.getItemId() == R.id.nav_item_sent) { FragmentTransaction xfragmentTransaction = mFragmentManager.beginTransaction(); xfragmentTransaction.replace(R.id.containerView,new NavTwo()).addToBackStack(null).commit(); } return false; } }); /** * Setup Drawer Toggle of the Toolbar */ Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); mDrawerToggle = new ActionBarDrawerToggle(this,mDrawerLayout, toolbar,R.string.app_name, R.string.app_name); mDrawerLayout.setDrawerListener(mDrawerToggle); mDrawerToggle.syncState(); } public void replaceFragment(Fragment fragment){ FragmentTransaction t = getSupportFragmentManager().beginTransaction(); t.replace(R.id.containerView, fragment).addToBackStack(null); t.commit(); } public void showArrow(){ mDrawerToggle.setDrawerIndicatorEnabled(false); //getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: onBackPressed(); break; default: break; } return super.onOptionsItemSelected(item); } } 

This topic may look very old and there might be many answers but my situation is very unique. 这个主题看起来很老,可能有很多答案,但是我的情况很独特。 I have to implement Navigation Drawer and TabLayout in MainActivity. 我必须在MainActivity中实现Navigation Drawer和TabLayout。 So I used this tutorial for that. 所以我为此使用了本教程 It uses FrameLayout + Navigation in MainActivity and attaches a fragment with the FrameLayout. 它在MainActivity中使用FrameLayout + Navigation,并使用FrameLayout附加一个片段。 This fragment has TabLayout. 该片段具有TabLayout。 Now I have a button in one of the Tab's fragment which will open another fragment. 现在,我在选项卡的一个片段中有一个按钮,它将打开另一个片段。 I want to display back arrow button in this new fragment. 我想在这个新片段中显示back arrow按钮。 I disabled drawertoggle but unable to show back button. 我禁用了抽屉切换功能,但无法显示后退按钮。 But my app crashes with a NullPointerException. 但是我的应用由于NullPointerException而崩溃。 Is there any other way to show the arrow button and also use it to go to previous fragment? 还有其他方法可以显示箭头按钮,也可以使用该按钮转到上一个片段吗?

Before you call commit(), however, you might want to call addToBackStack(), in order to add the transaction to a back stack of fragment transactions. 但是,在调用commit()之前,可能需要调用addToBackStack(),以便将事务添加到片段事务的后堆栈中。 This back stack is managed by the activity and allows the user to return to the previous fragment state, by pressing the Back button. 此后退堆栈由活动管理,并允许用户通过按“后退”按钮返回到先前的片段状态。

Example: 例:

FragmentTransaction tx = fragmentManager.beginTransation();
tx.replace( R.id.fragment, new MyFragment() ).addToBackStack( "tag" ).commit();

My solution: 我的解决方案:

main menu xml: 主菜单xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_settings"
      android:title="@string/action_settings"
      android:orderInCategory="100"
      app:showAsAction="never"/>

<item android:id="@+id/my_back_arrowID"
      android:icon="@drawable/arrow_left"
      android:visible="false"
      app:showAsAction="ifRoom">


</item>

MainActivity: 主要活动:

 @Override
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();


    if (id == R.id.action_settings) {
        Toast.makeText(MainActivity.this, "settings", Toast.LENGTH_SHORT).show();
    } else if (id == R.id.my_back_arrowID) {

        onBackPressed();


    }


    return super.onOptionsItemSelected(item);
}

Your fragment where you want the back arrow to be visible: 您希望向后箭头可见的片段:

 @Override
public void onPrepareOptionsMenu(Menu menu) {

    menu.findItem(R.id.my_back_arrowID).setVisible(true);


    super.onPrepareOptionsMenu(menu);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM