onBack从导航抽屉中的另一个片段压缩到Home Fragment

时间:2017-07-04 18:17:03

标签: android android-fragments navigation-drawer android-navigation-drawer onbackpressed

在我的应用程序中,我创建了一个包含六个片段的导航抽屉。 MainOption Fragment未包含在导航项目菜单列表中。现在我想激活移动设备上的后退按钮以重定向到主片段。例如,如果我有片段A,B,C,D,E,F,现在如果我单击B,那么如果我按下后退按钮,它将返回到A.同样如果我按下片段E上的后退按钮它将重定向到片段A.现在我如何在我的代码中实现这个逻辑。因此,我尝试了很多来自网站的代码,但不是这样。这是我的导航抽屉的代码贴纸

private NavigationView navigationView;
private DrawerLayout drawerLayout;
private Toolbar toolbar ;
private View navigationHeader;
private ImageView imgProfile;
private TextView txtName, txtWebsite;

// flag to load home fragment when user presses back key
private boolean shouldLoadHomeFragOnBackPress = true;
private Handler mHandler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    mHandler = new Handler();

    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    navigationView = (NavigationView) findViewById(R.id.nav_view);

    // Navigation view header
    navigationHeader= navigationView.getHeaderView(0);
    txtName = navigationHeader.findViewById(R.id.username);
    txtWebsite = navigationHeader.findViewById(R.id.email);
    imgProfile = navigationHeader.findViewById(R.id.profile_image);

    // load nav menu header data
    loadNavHeader();

    //Set the Home Fragment initially
    OptionMenuFragment fragment = new OptionMenuFragment();
    android.support.v4.app.FragmentTransaction fragmentTransaction =
            getSupportFragmentManager().beginTransaction();
    fragmentTransaction.replace(R.id.fragment_container, fragment, "OptionMenuFragment");
    fragmentTransaction.commit();

    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawerLayout.setDrawerListener(toggle);
    toggle.syncState();

    navigationView.setNavigationItemSelectedListener(this);
 }

 private void loadNavHeader() {
    // name, website
    txtName.setText("Hallo");
    txtWebsite.setText("mail.com");
    imgProfile.setImageResource(R.drawable.profile_image);

    //ToDo: Image should be uploaded from web
}

 String lastFragmentTag;
 boolean showingFirstFragment = true;

 public void addNewFragment(Fragment fragment, String fragmentTag) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();

    if (lastFragmentTag != null) {
        Fragment currentFragment = fragmentManager.findFragmentByTag(lastFragmentTag);
        transaction.remove(currentFragment);
    } else {
        Fragment currentFragment = fragmentManager.findFragmentById(R.id.fragment_container);
        transaction.hide(currentFragment);
    }

    transaction.add(R.id.fragment_container, fragment, fragmentTag);
    transaction.commit();

    lastFragmentTag = fragmentTag;
    showingFirstFragment = false;

 }
 @Override
 public void onBackPressed() {
    //Here we're gonna remove the last fragment added, and show OptionMenuFragment again
    if (!showingFirstFragment)
    {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();

        Fragment firstFragment = fragmentManager.findFragmentByTag("OptionMenuFragment");
        Fragment currentFragment = fragmentManager.findFragmentByTag(lastFragmentTag);

        transaction.remove(currentFragment);
        transaction.show(firstFragment);

        transaction.commit();

        showingFirstFragment = true;
    } else {
        super.onBackPressed();
    }
 }


 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.blu_home) {
        Intent intent = new Intent(this, MainOptionPage.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
        return true;
    }
    return super.onOptionsItemSelected(item);
  }


 @SuppressWarnings("StatementWithEmptyBody")
 @Override
 public boolean onNavigationItemSelected(MenuItem item) {

    String fragmentTag=null;
    // Handle navigation view item clicks here.
    Fragment fragment = null;
    FragmentManager fragmentManager = getSupportFragmentManager();
    switch (item.getItemId()) {
        case R.id.view_profile:
            fragment = new ViewProfileFragment();
            fragmentTag = "ViewProfileFragment";
            break;
        case R.id.todo_list:
            fragment =new ToDoListFragment();
            fragmentTag="ToDoListFragment";
            break;
        case R.id.logout:
            showAlertDialogLogOut();
            break;
        case R.id.settings:
            fragment = new SettingsFragment();
            fragmentTag="SettingFragment";
            break;
        case R.id.about:
            fragment = new AboutFragment();
            fragmentTag="AboutFragment";
            break;
        case R.id.info:
            fragment=new InfoFragment();
            fragmentTag="InfoFragment";
            break;
    }
    if(fragment!=null){
        fragmentManager.beginTransaction().replace(R.id.fragment_container, fragment).commit();
    }
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawerLayout.closeDrawer(GravityCompat.START);
    return true;
 }

 private void showAlertDialogLogOut() {

    AlertDialog.Builder builder = new AlertDialog.Builder(this);

    builder.setTitle("Logout");
    builder.setMessage("Are you sure you want to log out?");

    builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int which) {
            // close the dialog, go to login page
            dialog.dismiss();
            startActivity(new Intent(MainOptionPage.this, LoginPage.class));
        }
    });

    builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // Do nothing
            dialog.dismiss();
        }
    });

    AlertDialog alert = builder.create();
    alert.show();
  }
}

1 个答案:

答案 0 :(得分:0)

对于这种方法,您将需要使用add(containerViewId,fragment,tag)方法而不是replace(containerViewId,fragment),因为在添加之前,replace将为之前添加到容器的所有片段调用remove(Fragment)新的片段。此外,您还需要使用addToBackStack(name)。

这是我为项目创建的一种方法,稍作修改:

String lastFragmentTag;
boolean showingFirstFragment = true;

public void addNewFragment(Fragment fragment, String fragmentTag) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();

    if (lastFragmentTag != null) {
        Fragment currentFragment = fragmentManager.findFragmentByTag(lastFragmentTag);
        transaction.remove(currentFragment);
    } else {
        Fragment currentFragment = fragmentManager.findFragmentById(R.id.fragment_container);
        transaction.hide(currentFragment);
    }

    transaction.add(R.id.fragment_container, fragment, fragmentTag);
    transaction.commit();

    lastFragmentTag = fragmentTag;
    showingFirstFragment = false;
}

然后你只需要在onNavigationItemSelected:

中进行此更改
Fragment fragment = null;
FragmentManager fragmentManager = getSupportFragmentManager();

String fragmentTag;

switch (item.getItemId()) {
    case R.id.view_profile:
        fragment = new ViewProfileFragment();
        fragmentTag = "ViewProfileFragment";

        break;
    ...
}

if(fragment!=null){
        addNewFragment(fragment, fragmentTag);
}

其中" fragmentTag",将是一个String变量,您根据实例化的片段进行更改。

编辑:由于代码没有按预期工作,因此还有一些更改:

@Override
public void onBackPressed() {
    //Here we're gonna remove the last fragment added, and show OptionMenuFragment again
    if (!showingFirstFragment)
    {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();

        Fragment firstFragment = fragmentManager.findFragmentByTag("OptionMenuFragment");
        Fragment currentFragment = fragmentManager.findFragmentByTag(lastFragmentTag);

        transaction.remove(currentFragment);
        transaction.show(firstFragment);

        transaction.commit();

        showingFirstFragment = true;
    } else {
        super.onBackPressed();
    }
}

添加OptionMenuFragment时,请改为:

fragmentTransaction.replace(R.id.fragment_container, fragment, "OptionMenuFragment");