如何在导航抽屉中使用片段?

时间:2016-03-06 15:17:49

标签: android android-fragments navigation-drawer

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

  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. 我制作了Fragment Mananger,如下所示,

    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();
    
  6. 我研究了一点,但我无法成功。它不是在呼唤。

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

    我如何在正确的方式中使用侧面菜单。

    感谢。

4 个答案:

答案 0 :(得分:0)

以下是您要查找的链接:

Fragment Navigation Drawer

答案 1 :(得分:0)

您的导航视图应位于布局中的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" />

答案 2 :(得分:0)

建议在Drawer布局中使用navigationView。最简单的选择是使用android studio enter image description here提供的导航Activity

然后你可以编辑

中的项目
  

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;

  }

}

答案 3 :(得分:0)

在您的活动布局中

<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>

然后在“活动onCreate”方法中添加侦听器

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

,当您准备显示导航视图时,您只需替换navigationView内的片段

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>