I';我在导航视图项中遇到问题,请单击androidx中的侦听器

I';我在导航视图项中遇到问题,请单击androidx中的侦听器,android,navigation-drawer,androidx,Android,Navigation Drawer,Androidx,实际上,我正在开发一个包含导航视图的应用程序,该应用程序运行在androidx上,我从自己的角度尝试了所有可能的解决方案。实际问题是,即使我对基类实现了NavigationView.OnNavigationItemSelectedListener,onNavigationItemSelected也没有调用 实现导航视图的My HomeActivity类。OnNavigationItemSelectedListener是 public class HomeActivity extends AppC

实际上,我正在开发一个包含导航视图的应用程序,该应用程序运行在androidx上,我从自己的角度尝试了所有可能的解决方案。实际问题是,即使我对基类实现了NavigationView.OnNavigationItemSelectedListener,onNavigationItemSelected也没有调用

实现导航视图的My HomeActivity类。OnNavigationItemSelectedListener是

public class HomeActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

    private static final String TAG = "checkDate";
    ActivityHomeBinding binding;
    Context context;
    LinearLayoutManager layoutManager;
    HomeAdapter adapter;
    ActionBarDrawerToggle drawerToggle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        context = this;
        binding = DataBindingUtil.setContentView(this, R.layout.activity_home);

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

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        getSupportActionBar().setDisplayShowTitleEnabled(false);
        drawerToggle = new ActionBarDrawerToggle(this, binding.drawer, R.string.open, R.string.close);
        binding.drawer.addDrawerListener(drawerToggle);
        drawerToggle.syncState();

        drawerToggle.setDrawerIndicatorEnabled(false);
        drawerToggle.setHomeAsUpIndicator(R.drawable.ic_menu_black_24dp);

        List<EventDay> events = new ArrayList<>();
        Calendar calendar = Calendar.getInstance();
        events.add(new EventDay(calendar, R.drawable.ic_event_black_24dp));
        binding.homeLayout.calendarView.setEvents(events);

        binding.homeLayout.calendarView.setOnDayClickListener(eventDay -> {
            Toast.makeText(context, eventDay.getCalendar().getTime().toString(), Toast.LENGTH_SHORT).show();
            Log.d(TAG, "onDayClick: "+Calendar.DAY_OF_MONTH);
        });
        layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(RecyclerView.VERTICAL);
        adapter = new HomeAdapter(context);

        binding.homeLayout.rvEvents.setNestedScrollingEnabled(true);
        binding.homeLayout.rvEvents.setHasFixedSize(true);
        binding.homeLayout.rvEvents.setAdapter(adapter);
        binding.homeLayout.rvEvents.setLayoutManager(layoutManager);


        binding.navView.setNavigationItemSelectedListener(this);


        ItemClickSupport.addTo(binding.homeLayout.rvEvents).setOnItemClickListener((recyclerView, position, v) -> {
            Intent intent = new Intent(context, SiteReachActivity.class);
            startActivity(intent);
        });
    }

    @Override
    public void onBackPressed() {
        if (binding.drawer.isDrawerOpen(GravityCompat.START)){
            binding.drawer.closeDrawer(GravityCompat.START);
            return;
        }
        super.onBackPressed();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == android.R.id.home){
            binding.drawer.openDrawer(GravityCompat.START);
        }
        return true;
    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
        int id = menuItem.getItemId();
        Intent intent;
        switch (id){
            case R.id.menu_profile:
                intent = new Intent(context, ProfileActivity.class);
                startActivity(intent);
                break;
            case R.id.menu_dashboard:
                break;
            case R.id.menu_history:
                intent = new Intent(context, HistoryActivity.class);
                startActivity(intent);
                break;
            case R.id.menu_TADA:
                break;
            case R.id.menu_logOut:
                break;
        }
        return true;
    }
}  
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_profile"
        android:icon="@drawable/user"
        android:title="@string/user"/>
    <item android:id="@+id/menu_dashboard"
        android:icon="@drawable/home"
        android:title="Dashboard"/>
    <item android:id="@+id/menu_history"
        android:icon="@drawable/history"
        android:title="History"/>
    <item android:id="@+id/menu_TADA"
        android:icon="@drawable/wallet"
        android:title="TADA"/>
    <item
        android:id="@+id/menu_logOut"
        android:icon="@drawable/ic_power_settings_new_black_24dp"
        android:title="Logout"/>
</menu>  
公共类HomeActivity扩展AppCompatActivity实现NavigationView.OnNavigationItemSelectedListener{
私有静态最终字符串TAG=“checkDate”;
活动家庭绑定;
语境;
直线布局经理布局经理;
家庭适配器;
ActionBarDrawerToggle抽屉切换;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
上下文=这个;
binding=DataBindingUtil.setContentView(this,R.layout.activity\u home);
Toolbar Toolbar=findviewbyd(R.id.Toolbar);
设置支持操作栏(工具栏);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowTitleEnabled(false);
drawerToggle=newactionbardrawertoggle(this,binding.drawer,R.string.open,R.string.close);
装订.出票人.添加出票人链接(出票人切换);
drawerToggle.syncState();
抽屉切换。设置抽屉指示可启用(false);
抽屉切换。设置HomeAsupIndicator(R.drawable.ic_菜单_黑色_24dp);
列表事件=新建ArrayList();
日历=Calendar.getInstance();
添加(新的EventDay(日历,R.drawable.ic_event_black_24dp));
binding.homeLayout.calendarView.setEvents(事件);
binding.homeLayout.calendarView.setOnDayClickListener(eventDay->{
Toast.makeText(上下文,eventDay.getCalendar().getTime().toString(),Toast.LENGTH_SHORT).show();
Log.d(标记为“onDayClick:+日历日/月日”);
});
layoutManager=新的LinearLayoutManager(此);
layoutManager.setOrientation(RecyclerView.VERTICAL);
适配器=新的家庭适配器(上下文);
binding.homeLayout.rvEvents.setNestedScrollingEnabled(true);
binding.homeLayout.rvEvents.setHasFixedSize(true);
binding.homelograyout.rvEvents.setAdapter(适配器);
binding.homeLayout.rvEvents.setLayoutManager(layoutManager);
binding.navView.setNavigationItemSelectedListener(此);
ItemClickSupport.addTo(binding.homeLayout.rvEvents).setOnItemClickListener((recyclerView,position,v)->{
意向意向=新意向(上下文、SiteReachActivity.class);
星触觉(意向);
});
}
@凌驾
public void onBackPressed(){
if(binding.drawer.isDrawerOpen(GravityCompat.START)){
装订.drawer.closeDrawer(GravityCompat.START);
返回;
}
super.onBackPressed();
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
int id=item.getItemId();
if(id==android.R.id.home){
binding.drawer.openDrawer(GravityCompat.START);
}
返回true;
}
@凌驾
公共布尔值onNavigationItemSelected(@NonNull MenuItem MenuItem){
int id=menuItem.getItemId();
意图;
开关(id){
案例R.id.menu\U配置文件:
意图=新意图(上下文,ProfileActivity.class);
星触觉(意向);
打破
案例R.id.菜单\仪表板:
打破
案例R.id.menu\U历史记录:
intent=新的intent(context,HistoryActivity.class);
星触觉(意向);
打破
案例R.id.menu_TADA:
打破
案例R.id.菜单\注销:
打破
}
返回true;
}
}  
布局文件是

<?xml version="1.0" encoding="utf-8"?>
<layout 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">

    <androidx.drawerlayout.widget.DrawerLayout
        android:id="@+id/drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        tools:openDrawer="start">


        <com.google.android.material.navigation.NavigationView
            android:id="@+id/nav_view"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:fitsSystemWindows="true"
            android:background="@color/white"
            app:headerLayout="@layout/nav_header_main"
            app:itemIconTint="@color/colorPrimary"
            app:menu="@menu/activity_main_drawer"/>


        <include
            android:id="@+id/home_layout"
            layout="@layout/home_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </androidx.drawerlayout.widget.DrawerLayout>
</layout>  

活动主抽屉的布局文件是

public class HomeActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

    private static final String TAG = "checkDate";
    ActivityHomeBinding binding;
    Context context;
    LinearLayoutManager layoutManager;
    HomeAdapter adapter;
    ActionBarDrawerToggle drawerToggle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        context = this;
        binding = DataBindingUtil.setContentView(this, R.layout.activity_home);

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

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        getSupportActionBar().setDisplayShowTitleEnabled(false);
        drawerToggle = new ActionBarDrawerToggle(this, binding.drawer, R.string.open, R.string.close);
        binding.drawer.addDrawerListener(drawerToggle);
        drawerToggle.syncState();

        drawerToggle.setDrawerIndicatorEnabled(false);
        drawerToggle.setHomeAsUpIndicator(R.drawable.ic_menu_black_24dp);

        List<EventDay> events = new ArrayList<>();
        Calendar calendar = Calendar.getInstance();
        events.add(new EventDay(calendar, R.drawable.ic_event_black_24dp));
        binding.homeLayout.calendarView.setEvents(events);

        binding.homeLayout.calendarView.setOnDayClickListener(eventDay -> {
            Toast.makeText(context, eventDay.getCalendar().getTime().toString(), Toast.LENGTH_SHORT).show();
            Log.d(TAG, "onDayClick: "+Calendar.DAY_OF_MONTH);
        });
        layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(RecyclerView.VERTICAL);
        adapter = new HomeAdapter(context);

        binding.homeLayout.rvEvents.setNestedScrollingEnabled(true);
        binding.homeLayout.rvEvents.setHasFixedSize(true);
        binding.homeLayout.rvEvents.setAdapter(adapter);
        binding.homeLayout.rvEvents.setLayoutManager(layoutManager);


        binding.navView.setNavigationItemSelectedListener(this);


        ItemClickSupport.addTo(binding.homeLayout.rvEvents).setOnItemClickListener((recyclerView, position, v) -> {
            Intent intent = new Intent(context, SiteReachActivity.class);
            startActivity(intent);
        });
    }

    @Override
    public void onBackPressed() {
        if (binding.drawer.isDrawerOpen(GravityCompat.START)){
            binding.drawer.closeDrawer(GravityCompat.START);
            return;
        }
        super.onBackPressed();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == android.R.id.home){
            binding.drawer.openDrawer(GravityCompat.START);
        }
        return true;
    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
        int id = menuItem.getItemId();
        Intent intent;
        switch (id){
            case R.id.menu_profile:
                intent = new Intent(context, ProfileActivity.class);
                startActivity(intent);
                break;
            case R.id.menu_dashboard:
                break;
            case R.id.menu_history:
                intent = new Intent(context, HistoryActivity.class);
                startActivity(intent);
                break;
            case R.id.menu_TADA:
                break;
            case R.id.menu_logOut:
                break;
        }
        return true;
    }
}  
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_profile"
        android:icon="@drawable/user"
        android:title="@string/user"/>
    <item android:id="@+id/menu_dashboard"
        android:icon="@drawable/home"
        android:title="Dashboard"/>
    <item android:id="@+id/menu_history"
        android:icon="@drawable/history"
        android:title="History"/>
    <item android:id="@+id/menu_TADA"
        android:icon="@drawable/wallet"
        android:title="TADA"/>
    <item
        android:id="@+id/menu_logOut"
        android:icon="@drawable/ic_power_settings_new_black_24dp"
        android:title="Logout"/>
</menu>  


如果还需要什么,请发表评论TIA

如果您使用的是androidX,那么您必须使用NavController进行片段导航

我将发布我尝试过的代码

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

NavController mNavController;
Navigation mNavigation;
BottomNavigationView mBottomNavigationView;
NavigationView mNavigationView;
DrawerLayout mDrawerLayout;
Toolbar toolbar;


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

    toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
    mDrawerLayout = findViewById(R.id.drawer_layout);
    mBottomNavigationView = findViewById(R.id.bottom_navigation_view);
    mNavigationView = findViewById(R.id.navigation_view);


    //mNavController = Navigation.findNavController(this,R.id.host_fragment);
    mNavController = Navigation.findNavController(this,R.id.host_fragment);
    NavigationUI.setupWithNavController(mBottomNavigationView,Navigation.findNavController(this,R.id.host_fragment));

    NavigationUI.setupActionBarWithNavController(this, mNavController, mDrawerLayout);

    NavigationUI.setupWithNavController(mNavigationView,mNavController);

    mNavigationView.setNavigationItemSelectedListener(this);
    //NavigationUI.setupActionBarWithNavController(this,Navigation.findNavController(this,R.id.host_fragment));

}

@Override
public boolean onSupportNavigateUp() {
   /*return mNavController.popBackStack(R.id.host_fragment,false);*/
    return NavigationUI.navigateUp(Navigation.findNavController(this, R.id.host_fragment), mDrawerLayout);
}


@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onBackPressed() {
    NavController navController = Navigation.findNavController(this, R.id.host_fragment);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        if (Objects.requireNonNull(navController.getCurrentDestination()).getId() == R.id.nav_first) {
            finishAffinity();
        } else {
            mNavController.popBackStack(R.id.nav_first, false);
        }
    }
}

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()){
        case R.id.home:
            onBackPressed();
    }

    return super.onOptionsItemSelected(item);
}

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
    mDrawerLayout.closeDrawers();

    int id = menuItem.getItemId();

    switch (id){

        //Nav drawer items
        case R.id.profile:
            mNavController.navigate(R.id.profile);
            break;


        case R.id.features:
            mNavController.navigate(R.id.features);
            break;

        case R.id.signOut:
            finishAffinity();
            break;
    }
    return true;
}
}

您需要有主机片段,您需要在活动布局中实现片段,在活动布局中实现导航

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.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/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">


<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="0dp"
        android:layout_height="?attr/actionBarSize"
        android:background="@android:color/white"
        android:minHeight="?attr/actionBarSize"
        android:theme="?attr/actionBarTheme"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal"
            android:weightSum="10">

            <androidx.appcompat.widget.AppCompatTextView
                android:id="@+id/toolbar_title"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_weight="8"
                android:gravity="center"
                android:padding="10dp"
                android:text="@string/jetpack_example"
                android:textColor="#000"
                android:textSize="15sp" />

            <ImageView
                android:id="@+id/search_bar"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_weight="2"
                android:padding="10dp"
                android:src="@drawable/about_icon" />

        </LinearLayout>


    </androidx.appcompat.widget.Toolbar>

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_navigation_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:itemBackground="@android:color/white"
        app:labelVisibilityMode="selected"
        app:layout_constraintBottom_toBottomOf="@+id/host_fragment"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:menu="@menu/menu_drawer" />

    <fragment
        android:id="@+id/host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/navigation_graph"
        tools:layout_editor_absoluteX="0dp"
        tools:layout_editor_absoluteY="0dp" />


    </androidx.constraintlayout.widget.ConstraintLayout>


   <com.google.android.material.navigation.NavigationView
    android:id="@+id/navigation_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:menu="@menu/nav_drawer" />


</androidx.drawerlayout.widget.DrawerLayout>

接下来,您需要为导航创建导航图并使用参数。您还可以实现操作。创建一个导航文件夹,并在单击特定项目时实现下面的实现片段

导航图.xml

<?xml version="1.0" encoding="utf-8"?>
<navigation 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/navigation_graph"
app:startDestination="@id/nav_first">

<fragment
    android:id="@+id/nav_first"
    android:name="com.escapadetechnologies.jetpacknavigationexample.Fragments.FirstFragment"
    android:label="@string/first"
    tools:layout="@layout/fragment_first" />
<fragment
    android:id="@+id/nav_second"
    android:name="com.escapadetechnologies.jetpacknavigationexample.Fragments.SecondFragment"
    android:label="@string/second"
    tools:layout="@layout/fragment_second" />
<fragment
    android:id="@+id/nav_third"
    android:name="com.escapadetechnologies.jetpacknavigationexample.Fragments.ThirdFragment"
    android:label="@string/third"
    tools:layout="@layout/fragment_third" />
<fragment
    android:id="@+id/nav_fourth"
    android:name="com.escapadetechnologies.jetpacknavigationexample.Fragments.FourthFragment"
    android:label="@string/fourth"
    tools:layout="@layout/fragment_fourth" />
<fragment
    android:id="@+id/profile"
    android:name="com.escapadetechnologies.jetpacknavigationexample.Fragments.ProfileFragment"
    android:label="@string/profile"
    tools:layout="@layout/fragment_profile" />
<fragment
    android:id="@+id/features"
    android:name="com.escapadetechnologies.jetpacknavigationexample.Fragments.FeaturesFragment"
    android:label="@string/features"
    tools:layout="@layout/fragment_features" />


它非常方便,使用androidx可以避免很多样板代码。如果您有任何疑问,可以对我的答案发表评论。

如果可能,除了developers.android.com网站之外,你能通过片段与我分享任何教程链接或任何与NavController相关的信息吗?你知道我应该在哪里创建导航主机片段吗?我没有conent_主布局?我将添加你可以通过@Arunsriramula工作的全部代码如果你仍然有问题,我可以给我的github您可以使用@ArunSriramulaGitHub链接进行训练,这将非常棒。