0

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

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;
        }
    }
}
4

4 回答 4

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();
        }
    }
于 2017-02-16T10:17:44.230 回答
0

为您的主要活动创建一个 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”,其他片段的其他整数

于 2017-02-16T09:58:00.633 回答
0

用这个更新你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;
        }

    });
于 2017-02-16T10:11:29.287 回答
0

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

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。你必须触发它。请检查我的代码

于 2017-02-16T09:55:03.007 回答