导航抽屉未更新onBackPressed上的选定状态

时间:2018-01-09 12:20:57

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

我是android开发的初学者,实际上我有一个带有Fragments的导航抽屉我的问题是当我从导航抽屉中的状态转到片段b时成功更新到片段b但是当从片段A转到片段B时通过on'backpressed'方法,抽屉项状态不更新/更改为片段A.请帮我解决这个问题。

这是我的主要活动代码:

public class MainActivity extends AbsRuntimePermission implements NavigationView.OnNavigationItemSelectedListener {
    //, GoogleApiClient.OnConnectionFailedListener {

    private static final int REQUEST_PERMISSION = 10;
    private Toolbar toolBar;
    private NavigationView navDrawer;
    private DrawerLayout drawerLayout;
    private ActionBarDrawerToggle drawerToggle;
    private FirebaseAuth.AuthStateListener authListener;
    private FirebaseAuth auth;
    private View btnLogOut;
    private int selectedItem;
    private FirebaseDatabase mFirebaseDatabase;
    private DatabaseReference myRef;
    //  private GoogleApiClient googleApiClient;
    private FloatingActionButton fab;
    private CoordinatorLayout coordinatorLayout;
    private HomeFragment homeFragment=new HomeFragment();

    final String TAG = this.getClass().getName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        coordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinatorLayout);
        auth = FirebaseAuth.getInstance();
        final FirebaseUser user = auth.getCurrentUser();
        String userID = user.getUid();
        // Check if no view has focus:
        View view = this.getCurrentFocus();
        if (view != null) {
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
        fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, Contact_FAB.class);
                startActivity(intent);
            }
        });
        FragmentTransaction tx = getSupportFragmentManager().beginTransaction();
        tx.replace(R.id.main_content, homeFragment);
        tx.commit();
        final WebView webView = (WebView) findViewById(R.id.WV);
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webView.setWebViewClient(new WebViewClient() {
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
            }

            public void onPageFinished(WebView view, String url) {
                // do your stuff here}
                @Override
                public void onReceivedError (WebView view,int errorCode, String description, String
                failingUrl){
                    super.onReceivedError(view, errorCode, description, failingUrl);
                }
            });

    webView.loadUrl("https://google.co.in");

            requestAppPermissions(new String[] {
                Manifest.permission.READ_CONTACTS,
                        Manifest.permission.READ_EXTERNAL_STORAGE,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE
            },
            R.string.msg,REQUEST_PERMISSION);

            toolBar =(Toolbar)

            findViewById(R.id.app_bar);

            setSupportActionBar(toolBar);

            // If a notification message is tapped, any data accompanying the notification
            // message is available in the intent extras. In this project the launcher
            // intent is fired when the notification is tapped, so any accompanying data would
            // be handled here. If you want a different intent fired, set the click_action
            // field of the notification message to the desired intent. The launcher intent
            // is used when no click_action is specified.
            //
            // Handle possible data accompanying notification message.
    if(

            getIntent().

            getExtras() !=null)

            {
                for (String key : getIntent().getExtras().keySet()) {
                    String value = getIntent().getExtras().getString(key);
                    if (key.equals("AnotherActivity") && value.equals("True")) {
                        Intent intent = new Intent(this, AnotherActivity.class);
                        intent.putExtra("value", value);
                        startActivity(intent);
                        finish();
                    }

                }
            }

            // subscribeToPushService();

            drawerLayout =(DrawerLayout)

            findViewById(R.id.drawer_layout);

            navDrawer =(NavigationView)

            findViewById(R.id.menu_drawer);
    navDrawer.setNavigationItemSelectedListener(this);
            drawerToggle =new

            ActionBarDrawerToggle(this,drawerLayout, toolBar, R.string.drawer_open, R.string.drawer_close);
    drawerLayout.setDrawerListener(drawerToggle);
    drawerToggle.syncState();
            selectedItem =savedInstanceState ==null?R.id.nav_item_1 :savedInstanceState.getInt("selectedItem");

        }


        @Override
        public boolean onNavigationItemSelected (MenuItem menuItem){
            menuItem.setChecked(true);
            selectedItem = menuItem.getItemId();
            Fragment fragment = null;
            switch (selectedItem) {
                case R.id.nav_item_1:
                    fragment = new HomeFragment();
                    break;
                case R.id.nav_item_2:
                    fragment = new MicrosoftDskFragment();
                    break;
                case R.id.nav_item_3:
                    fragment = new GoogleDskFragment();
                    break;
                case R.id.nav_item_4:
                    fragment = new AppleDskFragment();
                    break;
                case R.id.nav_item_5:
                    fragment = new OthersDskFragment();
                    break;
                case R.id.nav_item_6:
                    fragment = new MobiSpecsFragment();
                    break;
                case R.id.nav_item_8:
                    Intent intent = new Intent(MainActivity.this, About.class);
                    startActivity(intent);
                    break;
                default:
                    break;
            }

            if (!DetectConnection.checkInternetConnection(MainActivity.this)) {
                Toast.makeText(MainActivity.this, "Plz check your network connectivity", Toast.LENGTH_SHORT).show();
            } else {

                if (fragment != null) {

                    FragmentManager fragmentManager = getSupportFragmentManager();
                    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                    fragmentTransaction.replace(R.id.main_content, fragment);
                    fragmentTransaction.addToBackStack(null);
                    fragmentTransaction.commit();
                }
            }

            drawerLayout.closeDrawer(GravityCompat.START);
            return true;
        }

        boolean twice = false;

        @Override
        public void onBackPressed () {
            DrawerLayout layout = (DrawerLayout) findViewById(R.id.drawer_layout);

            if (layout.isDrawerOpen(GravityCompat.START)) {
                layout.closeDrawer(GravityCompat.START);
            } else {
                if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
                    getSupportFragmentManager().popBackStack();
                } else {
                    Log.d(TAG, "click");

                    if (twice == true) {
                        Intent intent = new Intent(Intent.ACTION_MAIN);
                        intent.addCategory(Intent.CATEGORY_HOME);
                        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        startActivity(intent);
                        finish();
                        System.exit(0);
                    }
                    twice = true;
                    Log.d(TAG, "twice: " + twice);

                    //super.onBackPressed();
                    Toast.makeText(MainActivity.this, "Please Press Again To Exit", Toast.LENGTH_SHORT).show();

                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            twice = false;
                            Log.d(TAG, "twice: " + twice);
                        }
                    }, 3000);

                }
            }
        }

        @Override
        public boolean onKeyDown ( int keyCode, KeyEvent event){
            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                switch (keyCode) {
                    case KeyEvent.KEYCODE_BACK:
                        homeFragment.OnKeyDown(keyCode);
                        return true;
                }
            }
            return super.onKeyDown(keyCode, event);
        }


        @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 super.onCreateOptionsMenu(menu);
        }

        @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.profile) {
                Intent intent = new Intent(MainActivity.this, Profile.class);
                startActivity(intent);
                return true;
            }


            return super.onOptionsItemSelected(item);
        }


        @Override
        public void onSaveInstanceState (Bundle outState, PersistableBundle outPersistentState){
            super.onSaveInstanceState(outState, outPersistentState);

            outState.putInt("selectedItem", selectedItem);
        }

        @Override
        public void onPermissionsGranted ( int requestCode){
            //Do anything when permisson granted
            //   Toast.makeText(getApplicationContext(), "Permission granted", Toast.LENGTH_LONG).show();
        }


/*    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }

*/

    }
}

1 个答案:

答案 0 :(得分:0)

popBackStack()来自后堆栈的片段出现在屏幕上时,您需要侦听Back堆栈更改。

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.containerFrame);
            if (fragment != null) {
                // check for fragment and set the drawer state
                if(fragment instanceof Frag1){
                  // set drawer state for 1
                }else if(fragment instanceof Frag2){
                   // set drawer state for 2
                }
            }
        }
    });