【问题标题】:Android Studio version 3.5 Navigation DrawerAndroid Studio 3.5 版导航抽屉
【发布时间】:2020-01-15 10:25:48
【问题描述】:

你好,我想使用 kotlin 在 android studio 中使用导航抽屉。我正在查看一些文档和视频,但在 2018 年文档之前,系统使用 onNavigationItemSelected 方法。但是我在 android studio 3.5 版中看不到该方法。所以,我不能在片段之间传递。

这是我由android studio准备的mainactivity:

package com.example.myapplication;

import android.os.Bundle;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;

import android.view.View;

import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;

import com.google.android.material.navigation.NavigationView;

import androidx.drawerlayout.widget.DrawerLayout;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import android.view.Menu;

public class MainActivity extends AppCompatActivity {

    private AppBarConfiguration mAppBarConfiguration;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow,
                R.id.nav_tools, R.id.nav_share, R.id.nav_send)
                .setDrawerLayout(drawer)
                .build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onSupportNavigateUp() {
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        return NavigationUI.navigateUp(navController, mAppBarConfiguration)
                || super.onSupportNavigateUp();
    }
}

【问题讨论】:

  • 新的 Navigation Drawer 模板使用 Navigation 框架,它为您处理实际的 ActivityFragment 导航。这就是NavControllerNavigationUI 的内容。有一种方法可以传递Fragment 参数,但如果你真的不想要它,你可以删除所有导航代码,并自己实现OnNavigationItemSelectedListener
  • 那么,不删除导航代码,我要如何添加新片段?
  • 不清楚你在问什么。如果您的意思是如何在运行时处理新的Fragment 实例,导航框架将为您完成。相反,如果您的意思是如何将新的 Fragment 类和目的地集成到现有设置中,那么您只需学习如何配置导航框架。

标签: android kotlin navigation-drawer android-studio-3.5


【解决方案1】:

我做过这样的交易。

@Override
    public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
        int id = menuItem.getItemId();
    if (id == R.id.nav_home) {
        getSupportActionBar().setTitle("Home");
        getSupportFragmentManager().beginTransaction().replace(R.id.nav_host_fragment, menuFragment).commit();
    } else if (id == R.id.nav_profile) {
        profileFragment = new ProfileFragment();
        //profileFragment.setArguments(bundle);
        getSupportActionBar().setTitle("Profile");
        getSupportFragmentManager().beginTransaction().replace(R.id.nav_host_fragment, profileFragment).commit();
    }

    else if (id == R.id.nav_logout) {
        showDialogg("Do you want to Logout?", 2, "Logout");
        return true;
    }
    try {
       // ft.commit();
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return true;
}

【讨论】:

    【解决方案2】:
    navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
        @Override
        public void onDestinationChanged(@NonNull NavController controller, @NonNull
                NavDestination destination, @Nullable Bundle arguments) {
            if (destination.getId() == R.id.nav_home) {
                Toast.makeText(context, "home", Toast.LENGTH_LONG).show();
            }
            if (destination.getId() == R.id.nav_gallery) {
                Toast.makeText(context, "nav_gallery", Toast.LENGTH_LONG).show();
            }
            if (destination.getId() == R.id.nav_slideshow) {
                Toast.makeText(context, "nav_slideshow", Toast.LENGTH_LONG).show();
            }
            if (destination.getId() == R.id.nav_tools) {
                Toast.makeText(context, "nav_tools", Toast.LENGTH_LONG).show();
            }
            if (destination.getId() == R.id.nav_share) {
                Toast.makeText(context, "nav_share", Toast.LENGTH_LONG).show();
            }
            if (destination.getId() == R.id.nav_send) {
                Toast.makeText(context, "nav_send", Toast.LENGTH_LONG).show();
            }
            if (destination.getId() == R.id.logout) {
                Toast.makeText(context, "logout", Toast.LENGTH_LONG).show();
            }
        }
    

    【讨论】:

      【解决方案3】:
      <include
          layout="@layout/app_bar_main"
          android:layout_width="match_parent"
          android:layout_height="match_parent" />
      
      <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"
          app:headerLayout="@layout/nav_header_main"
          app:menu="@menu/activity_main_drawer" />
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-11
        • 2016-04-18
        • 2016-12-22
        • 2016-11-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多