【问题标题】:Android studio 2.2.3 back button activityAndroid studio 2.2.3 后退按钮活动
【发布时间】:2017-02-16 09:51:44
【问题描述】:

我创建了一个演示应用程序,它使用抽屉布局在同一窗口中包含菜单抽屉和选项卡式活动。问题是当我在抽屉菜单中选择片段时,它会重定向其相关片段页面,但是当点击返回按钮时选项卡式活动自动消失,我的应用程序出来了。我该如何解决这个问题?这是我的主要活动代码

import android.content.Intent;
import android.support.design.widget.NavigationView;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    DrawerLayout mDrawerLayout;
    NavigationView mNavigationView;
    FragmentManager mFragmentManager;
    FragmentTransaction mFragmentTransaction;
    //Button signIn;


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


        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()).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_income) {
                    FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
                    fragmentTransaction.replace(R.id.containerView,new IncomeFragment()).commit();

                }

                if (menuItem.getItemId() == R.id.nav_item_expence) {
                    FragmentTransaction xfragmentTransaction = mFragmentManager.beginTransaction();
                    xfragmentTransaction.replace(R.id.containerView,new TabFragment()).commit();
                }


                return false;
            }

        });
        /**
         * Setup Drawer Toggle of the Toolbar
         */

        android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar);
        ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(this,mDrawerLayout, toolbar,R.string.app_name,
                R.string.app_name);

        mDrawerLayout.setDrawerListener(mDrawerToggle);

        mDrawerToggle.syncState();

    }

    }

这是我的标签活动

package com.example.arunbhaskar.seconddemo;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by arun.bhaskar on 2/9/2017.
 */

public class TabFragment extends Fragment {
    public static TabLayout tabLayout;
    public static ViewPager viewPager;
    public static int int_items = 3 ;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        /**
         *Inflate tab_layout and setup Views.
         */
        View x =  inflater.inflate(R.layout.tablayout,null);
        tabLayout = (TabLayout) x.findViewById(R.id.tabs);
        viewPager = (ViewPager) x.findViewById(R.id.viewpager);
        /**
         *Set an Apater for the View Pager
         */

        viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
        /**
         * Now , this is a workaround ,
         * The setupWithViewPager dose't works without the runnable .
         * Maybe a Support Library Bug .
         */

        tabLayout.post(new Runnable() {
            @Override
            public void run() {
                tabLayout.setupWithViewPager(viewPager);
            }
        });

        return x;

    }
    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 Pie chart();
                case 1 : return new Graph();
                case 2 : return new Transaction();
            }
            return null;
        }

        @Override
        public int getCount() {
            return int_items;
        }
        @Override
        public CharSequence getPageTitle(int position) {

            switch (position){
                case 0 :
                    return "pie-chart";
                case 1 :
                    return "Graph";
                case 2 :
                    return "Transactions";
            }
            return null;
        }
    }
}

【问题讨论】:

  • 而不是替换片段添加片段。
  • 尝试在除第一个以外的所有分片事务中添加fragmentTransaction.addToBackStack(null)
  • 您的问题解决方案只是将所有片段添加到 backStatck,然后在您的活动中覆盖 backPress 以检查 backStackEntry

标签: android android-studio android-fragments navigation-drawer android-tabbed-activity


【解决方案1】:

首先在 backStack 中添加你的片段:

if (menuItem.getItemId() == R.id.nav_item_income) {
                FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
                fragmentTransaction.addToBackStack(null)  //this line is needed
                fragmentTransaction.replace(R.id.containerView,new IncomeFragment()).commit();

            }

现在在您的活动中:覆盖onBackPressed() 方法

@Override
public void onBackPressed() {
    FragmentManager fm = getSupportFragmentManager();
        if (fm.getBackStackEntryCount() > 0) {
            Log.i("MainActivity", "popping backstack");
            fm.popBackStack();
        } else {
            Log.i("MainActivity", "nothing on backstack, calling super");
           new AlertDialog.Builder(this)
                .setMessage("Are you sure you want to exit?")
                .setCancelable(false)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        finishAffinity();
                    }
                })
                .setNegativeButton("No", null)
                .show();
        }
    }

【讨论】:

    【解决方案2】:

    当您调用任何片段时,您必须添加它。如下所示

    mFragmentTransaction.addToBackStack("your_fregment_tag").commit();
    

    以及当回压时。这段代码

    @Override
        public void onBackPressed() {
    
            try {
                int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount();
    
                if (mDrawerLayout.isDrawerOpen(GravityCompat.END)) {
                    mDrawerLayout.closeDrawer(GravityCompat.END);
                    return;
                } else {
    
                    if (backStackEntryCount == 0) { // last fragment
                        android.app.AlertDialog.Builder alertDialog = new android.app.AlertDialog.Builder(DashboardActivity.this);
    
                        alertDialog.setTitle("Exit");
                        alertDialog.setMessage("Are you sure you want to Exit?");
    
                        alertDialog.setPositiveButton("YES",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int which) {
                                        //finish();
                                        //System.exit(0);
                                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                                            finishAffinity();
                                        }else{
                                            finish();
                                            System.exit(0);
                                        }
    
    
                                    }
                                });
    
                        alertDialog.setNegativeButton("NO",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int which) {
                                        dialog.cancel();
                                    }
                                });
    
                        alertDialog.show();
                        return;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    
    
    
            super.onBackPressed();
        }
    

    尝试使用 backStack。你必须触发它。请检查我的代码

    【讨论】:

      【解决方案3】:

      为您的主要活动创建一个 onbackpress 函数 比如这样

          @Override
      public void onBackPressed() {
          if (count == 1) {
              if (exit) {
                  super.onBackPressed();
                  return;
              } else {
                  Toast.makeText(this, "Press Back again to Exit.", Toast.LENGTH_SHORT).show();
                  exit = true;
                  new Handler().postDelayed(new Runnable() {
                      @Override
                      public void run() {
                          exit = false;
                      }
                  }, 2000);
              }
          }else {
              toolbar.setTitle("Home");
              mDrawerLayout.closeDrawers();
              count=1;
              display(0);
          }
      }
      

      将您的主片段的计数设置为“1”,其他片段的其他整数

      【讨论】:

        【解决方案4】:

        用这个更新你的NavigationItemSelectedListener

        mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(MenuItem menuItem) {
                    mDrawerLayout.closeDrawers();
                    if (menuItem.getItemId() == R.id.nav_item_income) {
                        FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
                        IncomeFragment fragment = new IncomeFragment();
                        String fragClassName = fragment.getClass().getName();
                        fragmentTransaction.replace(R.id.containerView, fragment).addToBackStack(fragClassName).commit();
                    }
        
                    if (menuItem.getItemId() == R.id.nav_item_expence) {
                        FragmentTransaction xfragmentTransaction = mFragmentManager.beginTransaction();
                        TabFragment fragment = new TabFragment();
                        String fragClassName = fragment.getClass().getName();
                        xfragmentTransaction.replace(R.id.containerView, fragment).addToBackStack(fragClassName).commit();
                    }
                    return false;
                }
        
            });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-29
          • 2011-12-18
          • 1970-01-01
          相关资源
          最近更新 更多