启动活动从材料导航抽屉中,该抽屉具有用于作为片段的菜单项的开关案例

时间:2015-08-15 20:30:36

标签: android android-fragments

我已经实现了一个Material Navigation Drawer,我想在选择导航抽屉中的一个菜单项而不是Profile Activity的一个片段时启动一个Activity。我不想在ProfileActivity中显示导航抽屉。我只想在从导航抽屉中选择菜单项时启动ProfileActivity。其他菜单项打开了我很好的片段。如果我在switch case语句中调用Intent,应用程序崩溃,因为我正在替换片段。

我目前使用的方法是

我打开FragmentProfile并在该Fragment中启动一个打开Profileactivity的Intent。

主要活动
    公共类MainActivity扩展了AppCompatActivity {

    private DrawerLayout mDrawerLayout;

    @Optional @InjectView(R.id.username)
    TextView _username;
    public String Username;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.inject(this);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        final ActionBar ab = getSupportActionBar();
        ab.setHomeAsUpIndicator(R.drawable.ic_menu);
        ab.setDisplayHomeAsUpEnabled(true);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        if (navigationView != null) {
            setupDrawerContent(navigationView);
        }
        navigationView.getMenu().performIdentifierAction(R.id.nav_dashboard, 0);

        Username = SingletonName.instance().Username;



        _username.setText(Username);
    }

    private void setupDrawerContent(NavigationView navigationView) {
        navigationView.setNavigationItemSelectedListener(
                new NavigationView.OnNavigationItemSelectedListener() {
                    @Override
                    public boolean onNavigationItemSelected(MenuItem menuItem) {
                        selectDrawerItem(menuItem);
                        return true;
                    }
                });

    }

    public void selectDrawerItem(MenuItem menuItem) {

        // Create a new fragment and specify the planet to show based on
        // position

        Fragment fragment = null;


        Class fragmentClass = null;

        switch (menuItem.getItemId()) {

            case R.id.nav_dashboard:
                fragmentClass = DashboardActivity.class;
//                Intent dashboard = new Intent(this, DashboardActivity.class);
//                startActivity(dashboard);


                break;

            case R.id.nav_history:


                Intent historyintent = new Intent(this, HistoryActivity.class);
                startActivity(historyintent);
                break;

            case R.id.nav_Flags:

                //    fragmentClass = ThirdFragment.class;

                break;
            case R.id.nav_Profile:

                fragmentClass = FragmentProfile.class;
                break;
            case R.id.nav_Contacts:
                fragmentClass = FragmentContact.class;
                break;

            case R.id.nav_Alerts:

                break;

            case R.id.nav_Logout:
                Intent loginintent = new Intent(this, LoginActivity.class);
                startActivity(loginintent);
                break;
            default:

                fragmentClass = DashboardActivity.class;

        }


        try {

            fragment = (Fragment) fragmentClass.newInstance();

        } catch (Exception e) {

            e.printStackTrace();

        }


        // Insert the fragment by replacing any existing fragment

        FragmentManager fragmentManager = this.getSupportFragmentManager();

        fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();


        // Highlight the selected item, update the title, and close the drawer

        menuItem.setChecked(true);

        setTitle(menuItem.getTitle());

        mDrawerLayout.closeDrawers();

    }

    @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.
        switch (item.getItemId()) {
            case android.R.id.home:
                mDrawerLayout.openDrawer(GravityCompat.START);
                return true;
        }
        //noinspection SimplifiableIfStatement
//        if (id == R.id.action_settings) {
//            return true;
//        }

        return super.onOptionsItemSelected(item);
    }
}

FragmentProfile 片段 公共类FragmentProfile扩展了Fragment {

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {



    Intent profile = new Intent(getActivity(), ProfileActivity.class);

    startActivity(profile);
    return super.onCreateView(inflater, container, savedInstanceState);

}

}

/ **  *创建于2015-07-01,获取s210121629。  * / ProfileActivity     公共类ProfileActivity扩展了ActionBarActivity {

    // Declaring Your View and Variables

    Toolbar toolbar;
    ViewPager pager;
    ViewPagerAdapter adapter;
    SlidingTabLayout tabs;
    CharSequence Titles[] = {"Personal Info", "Medical Info", "Contact Info"};
    int Numboftabs = 3;

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


        // Creating The Toolbar and setting it as the Toolbar for the activity

        toolbar = (Toolbar) findViewById(R.id.tool_bar);
        setSupportActionBar(toolbar);

        final ActionBar ab = getSupportActionBar();
        ab.setHomeAsUpIndicator(R.mipmap.ic_action_back);
        ab.setDisplayHomeAsUpEnabled(true);
        // Creating The ViewPagerAdapter and Passing Fragment Manager, Titles fot the Tabs and Number Of Tabs.
        adapter = new ViewPagerAdapter(getSupportFragmentManager(), Titles, Numboftabs);

        // Assigning ViewPager View and setting the adapter
        pager = (ViewPager) findViewById(R.id.pager);
        pager.setAdapter(adapter);

        // Assiging the Sliding Tab Layout View
        tabs = (SlidingTabLayout) findViewById(R.id.tabs);
        tabs.setDistributeEvenly(true); // To make the Tabs Fixed set this true, This makes the tabs Space Evenly in Available width

        username = getIntent().getStringExtra("username");
        // Setting Custom Color for the Scroll bar indicator of the Tab View
        tabs.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() {
            @Override
            public int getIndicatorColor(int position) {
                return getResources().getColor(R.color.md_cyan_900);
            }
        });

        // Setting the ViewPager For the SlidingTabsLayout
        tabs.setViewPager(pager);

        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            String value = extras.getString("new_variable_name");

            Bundle bundle = new Bundle();
            bundle.putString("message", value );
            PersonalinfoFragment fragInfo = new PersonalinfoFragment();
            fragInfo.setArguments(bundle);
        }
    }


    @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();
        switch (item.getItemId()) {

            case android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;

        }
        return super.onOptionsItemSelected(item);
    }
}

有没有更简单,更简洁的方法。

当前错误

 Process: com.example.s210121629.myhealth, PID: 31073
    java.lang.NullPointerException
            at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:417)
            at android.support.v4.app.BackStackRecord.replace(BackStackRecord.java:452)
            at android.support.v4.app.BackStackRecord.replace(BackStackRecord.java:444)
            at com.example.s210121629.myhealth.MainActivity.selectDrawerItem(MainActivity.java:151)
            at com.example.s210121629.myhealth.MainActivity$1.onNavigationItemSelected(MainActivity.java:72)
            at android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:136)
            at android.support.v7.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:811)
            at android.support.v7.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:153)
            at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:958)
            at android.support.design.internal.NavigationMenuPresenter.onItemClick(NavigationMenuPresenter.java:179)
            at android.widget.AdapterView.performItemClick(AdapterView.java:308)
            at android.widget.AbsListView.performItemClick(AbsListView.java:1524)
            at android.widget.AbsListView$PerformClick.run(AbsListView.java:3531)
            at android.widget.AbsListView$3.run(AbsListView.java:4898)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)

2 个答案:

答案 0 :(得分:1)

  

有一种更为简单的方法可以做到这一点。

IMO是的,但在这个阶段需要大量的重写。关于快速修复,从代码的外观来看,解决方案可能涉及此部分:

try {

    fragment = (Fragment) fragmentClass.newInstance();

} catch (Exception e) {

    e.printStackTrace();

}


FragmentManager = this.getSupportFragmentManager();

fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();

使用null支票进行环绕:

if (fragment != null) {
    //...
}

由于fragment永远不会赋值,因此应跳过实际加载片段的部分。

答案 1 :(得分:1)

而不是在切换案例结束时使用片段管理器。我改变了每个案例中的每个片段。

public void selectDrawerItem(MenuItem menuItem) {
        switch (menuItem.getItemId()) {

            case R.id.nav_dashboard:

                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.flContent, new DashboardActivity())
                        .commit();
                break;

//            case R.id.nav_history:
//
//
//                Intent historyintent = new Intent(this, HistoryActivity.class);
//                startActivity(historyintent);
//                break;

            case R.id.nav_Flags:

                //    fragmentClass = ThirdFragment.class;

                break;
            case R.id.nav_Profile:

                Intent profileActivity = new Intent(getApplicationContext(), ProfileActivity.class);
                startActivity(profileActivity);
               break;
            case R.id.nav_Contacts:
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.flContent, new FragmentContact())
                        .commit();
                break;

            case R.id.nav_Alerts:

                break;

            case R.id.nav_Logout:
                Intent loginintent = new Intent(this, LoginActivity.class);
                startActivity(loginintent);
                break;
            default:

                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.flContent, new DashboardActivity())
                        .commit();

        }