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

时间:2015-10-11 10:57:01

标签: android material-design

我正在使用可折叠的操作栏。 尝试启动新活动时遇到错误:无法解析构造函数'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;
        }
    });

2 个答案:

答案 0 :(得分:10)

根据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()传递上下文:

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

答案 1 :(得分:2)

你写道:

/*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的实例。