【问题标题】:How to use Fragment in Navigation Drawer?如何在导航抽屉中使用片段?
【发布时间】:2016-03-06 15:17:48
【问题描述】:

我试过了。我不成功。我正在写我的步骤。如果有人可以帮助我。

  1. 使用 Android Studio 创建新项目并选择“导航抽屉活动”
  2. 我将 FrameLayout 放在主要活动中,如下所示

    <?xml version="1.0" encoding="utf-8"?>
    <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/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        tools:openDrawer="start">
    
        <include
            layout="@layout/app_bar_vshome"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
        <android.support.design.widget.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_vshome"
            app:menu="@menu/activity_vshome_drawer" />
    
        <!-- Framelayout to display Fragments -->
        <FrameLayout
            android:id="@+id/frame_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
    </android.support.v4.widget.DrawerLayout>
    
  3. 我使用 v4.app.Fragment 创建了新课程,如下所示

    public class VSAllTopics extends Fragment{
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            return inflater.inflate(R.layout.fragment_all_topics, container, false);
        }
    }
    
  4. 我做了片段管理器,如下,

    public class FragmentManager extends Fragment {
    
    } 
    
  5. 调用 **public boolean onNavigationItemSelected(MenuItem item) **

    android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction ft = fragmentManager.beginTransaction();
    
    if (id == R.id.nav_camera) {
    
        ft.replace(R.id.frame_container, new VSAllTopics(), "VS_ALL").commit();
    

我学了一点,但没能成功。它不是在召唤。

如果我通过 Intent 调用它,它会删除 NAVIGATION ;(

如何正确使用侧边菜单。

谢谢。

【问题讨论】:

标签: android android-fragments navigation-drawer


【解决方案1】:

在您的活动布局中

<androidx.drawerlayout.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".view_controllers.diagrams.DiagramEditorScreen"
    android:id="@+id/diagramEditorMainDrawerLayout"
>

.... {your activity layout}

    <com.google.android.material.navigation.NavigationView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:id="@+id/diagramEditorSlideInMenuNavigationView"
            app:itemTextColor="@color/white"
    >
        <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@+id/diagramEditorSlideInMenuFragmentHolder"
        >
        </FrameLayout>
    </com.google.android.material.navigation.NavigationView>
</androidx.drawerlayout.widget.DrawerLayout>

然后在你的 Activity onCreate 方法中添加监听器

val actionDrawerToggle = ActionBarDrawerToggle(this, diagramEditorMainDrawerLayout, R.string.open, R.string.close)
diagramEditorMainDrawerLayout.addDrawerListener(actionDrawerToggle)
actionDrawerToggle.syncState()

当你准备好显示导航视图时,你可以替换导航视图中的片段

supportFragmentManager.beginTransaction()
    .replace(R.id.diagramEditorSlideInMenuFragmentHolder, {your-fragment}, {your-fragment-tag})
    .commit()

diagramEditorMainDrawerLayout.openDrawer(GravityCompat.START)

注意:以上是用 androidX 完成的。如果您不使用 androidX,您对 navigationView 的布局调用应该是

<android.support.v4.widget.DrawerLayout
....
>
   <android.support.design.widget.NavigationView 
   ... 
   />

</android.support.v4.widget.DrawerLayout>

【讨论】:

  • 有帮助。谢谢。
【解决方案2】:

您的导航视图应位于布局中的 FrameLayout 之后。

Android 按照其在 xml 中显示的顺序绘制每个视图。由于您的 FrameLayout 具有 match_parent 的宽度和高度,android 会将其绘制在您的 NavigationView 上方。

以下是解决方案的代码:

<include
layout="@layout/app_bar_vshome"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<!-- Framelayout to display Fragments -->
<FrameLayout
    android:id="@+id/frame_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<android.support.design.widget.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_vshome"
    app:menu="@menu/activity_vshome_drawer" />

【讨论】:

  • 我改变了它的位置,但它还没有工作。它在单击侧边菜单时一次又一次地显示相同的第一个屏幕。
【解决方案3】:

建议在Drawer布局中使用navigationView。最简单的选择是使用android studio提供的navigationActivity@

然后你可以编辑项目

activity_main_drawer.xml

并添加您自己的项目及其各自的图标。

您也可以在

中编辑导航标题视图

navigation_header_main.xml

为了在 Activity 的 NavigationDrawer 中使用 Fragment

像这样使用它:

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

  switch (id) {
    case R.id.item1:
      getSupportFragmentManager().beginTransaction().replace(R.id.fragment1, new item1Fragment()).commit();
      break;

    case R.id.change_settings:
      getSupportFragmentManager().beginTransaction().replace(R.id.fragment1, new item2Fragment()).commit();
      break;

  }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多