簡體   English   中英

帶有片段或活動的 Android Studio 導航抽屜

[英]Android studio navigation drawer with fragment or activities

我正在嘗試使用 Android Studio 的導航抽屜模板開發應用程序。 所以,我使用這個模板創建了一個新項目。 但是當我運行程序並單擊菜單項時,視圖不會改變。 我在互聯網上到處搜索,但我沒有看到如何處理這個問題。

這是Android Studio提供的代碼:

 public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.

    int id = item.getItemId();

    if (id == R.id.nav_camara) {


    } else if (id == R.id.nav_gallery) {

    } else if (id == R.id.nav_slideshow) {

    } else if (id == R.id.nav_manage) {

    } else if (id == R.id.nav_share) {

    } else if (id == R.id.nav_send) {

    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

我想要實現的是用單擊菜單項的適當視圖替換當前視圖。

Fragment 是執行此操作的最佳方法,還是應該為每個菜單項創建不同的活動?

在您的情況下,添加片段將是最好的解決方案。

創建一個片段 BlankFragment.java

public class BlankFragment extends Fragment {

    public BlankFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_blank, container, false);
    }

}

並創建 fragment_black.xml

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.above_inc.shyam.drawer.BlankFragment">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/hello_blank_fragment" />

</FrameLayout>

現在替換你的方法

public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();

    Fragment fragment = null;
    if (id == R.id.nav_camera) {
        // Handle the camera action
        fragment = new BlankFragment();
    } else if (id == R.id.nav_gallery) {

    } else if (id == R.id.nav_slideshow) {

    } else if (id == R.id.nav_manage) {

    } else if (id == R.id.nav_share) {

    } else if (id == R.id.nav_send) {

    }

    if (fragment != null) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.frame_container, fragment).commit();

    }
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;

}

在 content_main.xml 中添加以下代碼

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.above_inc.shyam.drawer.MainActivity"
    tools:showIn="@layout/app_bar_main">


    <FrameLayout
        android:id="@+id/frame_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</RelativeLayout>

您還可以將更多片段添加到與上面代碼中的相機相同的其他選項中

如果您希望在單擊菜單項時在下一個屏幕上顯示導航抽屜,則 Fragment 將是最佳方式。

如果您將使用活動,則不會顯示導航抽屜,除非您創建一個擴展導航抽屜並在任何地方使用的 BaseActivity。 在這種情況下,您也必須更改活動過渡動畫,因為單擊可能看起來很奇怪的菜單后會彈出新活動。

右鍵單擊您的項目 -> 新建 -> 片段。

相應地編輯開關盒。

@Passiondroid僅在您希望在所有活動中使用導航抽屜時才使用 Fragments答案是正確的。

關於單擊菜單項開始活動,在我的一個應用程序中,我遵循這個,

public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        switch(id)
        {

            case R.id.nav_profile:
            selection = 1;
                intent = new Intent("android.intent.action.WEB");
                intent.putExtra("selection",selection);
                startActivity(intent);
                break;
            case R.id.nav_books:
                intent = new Intent("android.intent.action.WEBD");
                selection = 2;
                intent.putExtra("selection",selection);
                startActivity(intent);
                break;
            case R.id.fav_quotes:
                intent = new Intent ("android.intent.action.SHOWFAVTES");
                selection = 3;
                intent.putExtra("selection",selection);
                startActivity(intent);
                break;
             default:
                break;
        }

要更改和配置菜單項,您可以在 res->Menu 下找到“activity_main_drawer.xml”。

單擊每個菜單項后,您可以根據自己的意願開始活動。 在使用之前,您已在 AndroidManifest.xml 文件中聲明活動。

在此處輸入圖片說明

從 android studio > 3.5 開始,您將意識到當您創建導航抽屜活動時,它會在單擊抽屜項目時生成片段打開。

如果你想打開一個活動,你可以是一個聽眾。

 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,R.id.nav_accounts)
            .setDrawerLayout(drawer)
            .build();
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
    NavigationUI.setupWithNavController(navigationView, navController);


    navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
        @Override
        public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) {

            int menuId = destination.getId();

            switch (menuId){
                case R.id.nav_gallery:
                    Toast.makeText(MainActivity.this,"You tapped gallery",Toast.LENGTH_LONG).show();
                    fab.hide();

                    break;
                    default:
                        fab.show();
                        break;
            }

        }
    });

完整教程。 導航抽屜

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM