Java 使用片段在活动中实现导航抽屉
我目前正在重新设计我的应用程序,以包括一个导航抽屉,用于在应用程序中导航。目前,每个屏幕都是一个活动,我设计主屏幕的方式是,它包含一个工具栏和另一个xml文件Java 使用片段在活动中实现导航抽屉,java,android,android-layout,android-fragments,navigation-drawer,Java,Android,Android Layout,Android Fragments,Navigation Drawer,我目前正在重新设计我的应用程序,以包括一个导航抽屉,用于在应用程序中导航。目前,每个屏幕都是一个活动,我设计主屏幕的方式是,它包含一个工具栏和另一个xml文件 <?xml version="1.0" encoding="utf-8"?> 现在,我为导航抽屉制作了另一个XML文件: <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/and
<?xml version="1.0" encoding="utf-8"?>
现在,我为导航抽屉制作了另一个XML文件:
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- The main content view where fragments are loaded -->
<FrameLayout
android:id="@+id/flContent"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</LinearLayout>
<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:menu="@menu/activity_main_drawer" />
我的缺点是,由于我的工具栏位于home.xml片段中,当我切换片段时,我将丢失工具栏。我想保留导航抽屉中所有视图的工具栏
另外,在我的java代码中,setActionBar(工具栏)抛出了一个错误,表示无法解析方法setActionBar 在您的活动中尝试此功能
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle("");
setSupportActionBar(toolbar);
这是我的.xml文件
<?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"
android:paddingBottom="@dimen/design_navigation_separator_vertical_padding"
tools:openDrawer="start">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical">
<include
android:id="@+id/toolbar"
layout="@layout/apptoolbar" />
<FrameLayout
android:id="@+id/frame_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/nav_toolbar"
android:clickable="true">
</FrameLayout>
</RelativeLayout>
<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:background="@color/appColor"
android:fitsSystemWindows="true"
android:paddingBottom="@dimen/design_navigation_separator_vertical_padding"
app:itemTextAppearance="@style/NavigationDrawerStyle"
app:headerLayout="@layout/nav_header_home"
app:itemBackground="@color/appColor"
app:itemTextColor="@color/drawable_selector_drawer_item"
app:menu="@menu/activity_home_drawer" />
</android.support.v4.widget.DrawerLayout>
在活动中集成NavigationDrawer和Fragment的一个简单而直接的解决方案是以以下方式设计
活动\u main.xml
:
<?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"
android:layoutDirection="rtl"
tools:openDrawer="start">
<include
layout="@layout/content_act_main"
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"
android:background="@color/flat_white_light">
</android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>
如果您注意到,在
conten\u act\u main.xml
中,有一个工具栏可用于FrameLayout
中显示的所有内容,您可以使用此FrameLayout作为片段的容器。您当然可以维护此工具栏,您需要ActionBarDrawerToggle
将抽屉布局
和工具栏
绑定在一起
最低配置或多或少是:
ActionBarDrawerToggle actionBarDrawerToggle;
DrawerLayout drawerLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
drawerLayout = (DrawerLayout) findViewById(R.id.navigation_drawer);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
actionBarDrawerToggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.app_name,R.string.app_name);
drawerLayout.setDrawerListener(actionBarDrawerToggle);
}
然后将工具栏放在基本活动布局中,其他视图包装在DrawerLayout
中
....
....
所以我应该将工具栏放在基本活动中?XML呢?我能把它和抽屉一起放吗?我不能使用supportActionBar,我没有使用此工具栏的支持库。谢谢,这很有帮助。我会试着让你知道。这很有效,但现在我的布局被严重破坏了。有什么建议吗?在图片中显示布局的xml此布局位于名为main.xml的文件中,该文件是home.xml的一部分,home.xml是content.xml的一部分。如果你有电子邮件,我可以发给你。在这里展示太多了,不能。未解析setSupportActionbar。如果我不使用支持库,那么ActionBarDrawerToggle()函数就不会接受正确的参数。大多数情况下,在android.support.v7.widget.Toolbar
和扩展AppCompatActivity
或ActionBarActivity
下可以识别setSupportActionbar。无法识别。未解析setSupportActionbar。如果我不使用支持库,那么ActionBarDrawerToggle()函数就不会接受正确的参数。我在没有“toolbar”参数的情况下通过了构造函数,现在我的屏幕都倾斜了。Richeek,尝试使用这些组合,看看它是否适用于Android.support.v4.widget.DrawerLayout;,Android.support.v7.app.ActionBarDrawerToggle;,和Android.support.v7.widget.Toolbar;以及扩展ActionBarActivity的基本活动。由于在ActionBarDrawerToggle()中未正确传递,工具栏不知何故与抽屉重叠。请看一看,它可能会对您有所帮助。如果片段本身与抽屉布局的项目相对应,那么请签出
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?actionBarSize"
android:background="?attr/colorPrimary"
android:theme="@style/ToolbarColoredBackArrow"
app:popupTheme="@style/AppTheme.PopupOverlay" >
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
ActionBarDrawerToggle actionBarDrawerToggle;
DrawerLayout drawerLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
drawerLayout = (DrawerLayout) findViewById(R.id.navigation_drawer);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
actionBarDrawerToggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.app_name,R.string.app_name);
drawerLayout.setDrawerListener(actionBarDrawerToggle);
}
<Android.support.v4.widget.DrawerLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/navigation_drawer"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true">
<Android.support.v7.widget.Toolbar
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
></Android.support.v7.widget.Toolbar>
....
....
</Android.support.v4.widget.DrawerLayout>