Fragment 与 AppCompat 工具栏重叠 [英] Fragment overlaps the AppCompat toolbar
问题描述
我正在使用 v7 支持库并尝试在左侧有一个导航抽屉.正如我在别处读到的那样:
I'm working with the v7 support library and trying to have a navigation drawer on the left. As read elsewhere I set up:
DrawerTest.java:保存抽屉的主要活动,我将工具栏加载到其中使用
setSupportActionBar()
,来自自定义 XML 布局,该布局包含只是工具栏
;
DrawerTest.java: The main activity that holds the drawer, into which I load my Toolbar with
setSupportActionBar()
, from a custom XML layout that holds just theToolbar
;
toolbar.xml:包含工具栏的 XML 布局;
toolbar.xml: A XML layout holding the toolbar;
activity_drawer_listview.xml:一个 DrawerLayout
XML 资源,为我的片段保存容器(一个 FrameLayout <包括>
2 中提到的布局.)导航抽屉(一个 ListView);
activity_drawer_listview.xml: A DrawerLayout
XML resource, that holds containers for my fragment
(a FrameLayout <including>
the layout mentioned in 2.) and for the
navigation drawer (a ListView);
FragmentTest.java:一些非常简单的片段代码,扩展了Fragment
;
FragmentTest.java: Some really simple fragment code, extending Fragment
;
我将在这里粘贴一些代码,无论如何我的问题是片段布局似乎从屏幕顶部开始,而不是从工具栏
的底部开始.5. 中的任何文本都将与操作栏上的应用程序标题重叠.我哪里错了?
I'll paste some code here, anyway my problem is that the fragment layout seems to start from the top of the screen, and not from the bottom of the Toolbar
. Any text put in 5. will overlap the app title on the action bar. Where am I wrong?
(1.) DrawerTest.java
public class DrawerTest extends ActionBarCompat {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_drawer_listview);
DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
Toolbar tb = (Toolbar) findViewById(R.id.toolbar_main2);
ActionBarDrawerToggle abDrawerToggle = new ActionBarDrawerToggle(
this, drawerLayout, tb,
R.string.navigation_drawer_open,
R.string.navigation_drawer_close )
{
// onDrawerClosed() { ... }
// onDrawerOpened() { ... }
};
drawerLayout.setDrawerListener(abDrawerToggle);
setSupportActionBar(tb);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
abDrawerToggle.syncState();
//code to load my fragment
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.frame_layout_test, new FragmentTest()).commit();
}
}
(3.) activity_drawer_listview.xml
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout"
android:layout_width="match_parent" android:layout_height="match_parent"
tools:context="miav.ciotole.DrawerTest">
<FrameLayout android:id="@+id/frame_layout_test" android:layout_width="match_parent"
android:layout_height="match_parent" >
<include layout="@layout/toolbar"/> <!-- What is this line about? -->
</FrameLayout>
<ListView
android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp" />
</android.support.v4.widget.DrawerLayout>
(4.) FragmentTest.java
public class FragmentTest extends Fragment {
public FragmentTest() { }
@Override
public View onCreateView(LayoutInflater infl, ViewGroup container, Bundle SavedInstanceState) {
View rootView = infl.inflate(R.layout.fragment_test_layout, container, false);
return rootView;
}
}
(5.) fragment_test_layout.xml
<RelativeLayout 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"
// padding ...
>
<TextView android:id="@+id/section_label" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world"/>
注意:我发现了一些问题(和答案),但在大多数情况下,问题与 AppCompat 版本有关19,这不是我的情况.
Note: I found some questions (and answers), but in most cases, the issue was related to AppCompat versions < 19, which is not my case.
注2:我从 Theme.AppCompat.NoActionBar 继承,因为我在运行时设置工具栏.也许我可以解决从 Theme.AppCompat 继承的问题并避免使用 setSupportActionBar()
,但如果可能的话,我会保留实际配置,因为它更容易控制 ActionBar.
Note2: I am inheriting from Theme.AppCompat.NoActionBar, as I'm setting the toolbar on runtime. Probably I could solve inheriting from Theme.AppCompat and avoid using setSupportActionBar()
, but if possible I would stay with the actual configuration, as it makes easier to control the ActionBar.
推荐答案
原因是因为您将其放置在框架布局中,然后将片段添加到工具栏的顶部.你需要做这样的事情
The reason is because you place it in a frame layout and then you add the fragment ontop of the toolbar. you need to do something like this
<android.support.v4.widget.DrawerLayout
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">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<FrameLayout
android:id="@+id/left_drawer"
android:layout_width="325dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#FFFFFF"/>
</android.support.v4.widget.DrawerLayout>
这篇关于Fragment 与 AppCompat 工具栏重叠的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!