繁体   English   中英

如何在单击的材料导航抽屉菜单项上启动活动

[英]How to start an activity on material navigation drawer menu item clicked

我正在使用可折叠的动作栏。 尝试启动新活动时遇到错误:无法解析构造函数'Intent(匿名android.support.design.widget.NavigationView.OnNavigationItemSelectedListener,java.lang.Class)'

请帮帮我:

我们可以使用导航抽屉菜单项单击启动新活动吗?

要么

我们只能选择在菜单项单击时替换并显示导航抽屉中的片段

FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.containerView,new SentFragment()).commit();

如果是,那么如何替换tab活动和viewpager并设置操作栏高度?

activity_main.xml

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.test.app.activities.MainActivity">

<android.support.design.widget.CoordinatorLayout
    android:id="@+id/rootLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/app_bar_height"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:minHeight="?attr/actionBarSize"

            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

        <android.support.design.widget.TabLayout
            android:id="@+id/tabLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabIndicatorHeight="4dp"
            app:tabGravity="fill"
            app:tabMode="scrollable"
            app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

    </android.support.design.widget.AppBarLayout>

         <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />



    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fabBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_marginBottom="@dimen/fab_margin_bottom"
        android:layout_marginRight="@dimen/fab_margin_right"
        android:src="@drawable/ic_plus"

        app:borderWidth="0dp"
        app:fabSize="normal" />

</android.support.design.widget.CoordinatorLayout>

<android.support.design.widget.NavigationView
    android:id="@+id/navigation"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:headerLayout="@layout/nav_header"
    app:itemIconTint="@color/nav_item_icon_tint_color"
    app:itemTextColor="@color/nav_item_text_color"
    app:menu="@menu/navigation_drawer_items" />

MainActivity.java

navigation = (NavigationView) findViewById(R.id.navigation);
    navigation.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(MenuItem menuItem) {
            int id = menuItem.getItemId();
            drawerLayout.closeDrawers();
            switch (id){
                case R.id.home:
                    //do something here
                    //open new activity
                    /*unable to start activity*/
                    //Intent intent = new Intent(this, NewActivity.class);
                    /* error on above line shown: Cannot resolve constructor 'Intent(anonymous android.support.design.widget.NavigationView.OnNavigationItemSelectedListener, java.lang.Class<com.test.app.activities.RouteActivity>)'*/
                    break;
                case R.id.logout:
                   //add navigation drawer item onclick method here
                    break;

            }
            return false;
        }
    });

根据Android Docs开始新活动,你必须做:

1)在你的班级中添加这一行:

import android.content.Intent;

2)向清单添加新活动,如下所示:

 <activity
        android:name=".YourActivityName"
        android:label="YourActivityName">
        <intent-filter>
            <action android:name="package.name.YOURACTIVITYNAME" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

3)使用startActivity()方法启动活动,如下所示:

Intent newAct = new Intent(getApplicationContext(), YourActivityName.class);
startActivity(newAct);

3a)如果你的类扩展了Activity你可以传递this而不是getApplicationContext()

Intent newAct = new Intent(this, YourActivityName.class);
startActivity(newAct);

3b)如果你的类扩展了Fragment你必须使用getActivity()来传递Context:

Intent newAct = new Intent(getActivity(), YourActivityName.class);
startActivity(newAct);

你写道:

/*unable to start activity*/
Intent intent = new Intent(this, NewActivity.class);

无法解析构造函数'Intent(匿名android.support.design.widget.NavigationView.OnNavigationItemSelectedListener,java.lang.Class)'

this是一个NavigationView.OnNavigationItemSelectedListener的实例。

但是Intent的第一个构造函数参数应该是Context

因此,将Context设置为NavigationView.OnNavigationItemSelectedListener之外的最终变量:

final Context context = this;
navigation = (NavigationView) findViewById(R.id.navigation);
navigation.setNavigationItemSelectedListener(
    new NavigationView.OnNavigationItemSelectedListener() {
        @Override
        ...

然后将上下文传递给Intent的构造函数。

Intent intent = new Intent(context, NewActivity.class);

这将是工作。

或者,我不会使用匿名对象。 我将在MainActivity本身中实现NavigationView.OnNavigationItemSelectedListener

MainActivity extends Activity
        implements NavigationView.OnNavigationItemSelectedListener {
    ...
    @Override
    public boolean onNavigationItemSelected(MenuItem menuItem) {
       ...
       Intent intent = new Intent(this, NewActivity.class);

通过这种方式,您可以将this用作Context的实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM