Фрагмент перекрывает панель инструментов AppCompat
Я работаю с библиотекой поддержки v7 и пытаюсь разместить панель навигации слева.
Как читалось в другом месте, я настроил:
DrawerTest.java: основное действие, которое содержит ящик, в который я загружаю свою панель инструментов
с setSupportActionBar()
из пользовательского макета XML, который содержит
только Toolbar
;
toolbar.xml: макет XML, содержащий панель инструментов;
activity_drawer_listview.xml: XML-ресурс DrawerLayout
, в котором хранятся контейнеры для моего фрагмента.
(FrameLayout <including>
макет, упомянутый в 2.) и для
навигационный ящик (ListView);
FragmentTest.java: действительно простой фрагмент кода, расширяющий Fragment
;
- frag_test_layout.xml: действительно простой фрагментный макет, внутри которого есть только TextView.
Я вставлю здесь некоторый код, в любом случае, моя проблема в том, что макет фрагмента начинается с верхней части экрана, а не с нижней части Toolbar
. Любой текст, вставленный в 5., будет перекрывать заголовок приложения на панели действий. Где я не прав?
(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.) фрагмент_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 & lt; 19, что не в моем случае.
Примечание 2: Я наследую от Theme.AppCompat.NoActionBar, так как я устанавливаю панель инструментов во время выполнения. Возможно, я мог бы решить наследование от Theme.AppCompat и избежать использования setSupportActionBar()
, но, если возможно, я бы остался с реальной конфигурацией, так как это облегчает управление ActionBar.
Ответы
Ответ 1
Причина в том, что вы размещаете его в макете фрейма, а затем добавляете фрагмент на панели инструментов. вам нужно сделать что-то вроде этого
<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>
Ответ 2
Добавьте эту строку в свой FrameLayout
app:layout_behavior="@string/appbar_scrolling_view_behavior"
Ответ 3
Вы помещаете панель инструментов в тот же Framelayout (с id = frame_layout_test). FrameLayout перекрывает представления.
Я думаю, вы пытаетесь сделать что-то вроде этого:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<include layout="@layout/toolbar"/>
<!-- I don't know what your Toolbar layout is -->
<android.support.v4.widget.DrawerLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
tools:context="miav.ciotole.DrawerTest">
<FrameLayout android:id="@+id/frame_layout_test"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<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>
</LinearLayout>
Макет сверху берет линейный макет и выравнивает рамку (где вы будете раздувать рамку) под панелью инструментов...
Эти строки
android:layout_height="0dp"
android:layout_weight="1"
говорит, что DrawerLayout должен взять оставшуюся высоту под панелью инструментов.
Однако, если вы хотите отобразить традиционную панель действий/панель инструментов, вам не нужно добавлять панель инструментов в макет xml. Вы просто можете изменить тему активности на @style/Theme.AppCompat.Light.DarkActionBar
Ответ 4
Это очень просто и легко. Просто следуйте тому, что я попытался сказать ниже.
Вы заменяете любой вид, используя:
**
getFragmentManager().beginTransaction()
.replace(R.id.blankFragment, new SettingsFragment())
.commit();
**
// Здесь blackFragment - это идентификатор FrameLayout View. Вы заменяете FrameLayout View на Fragment Layout. Примечание. Это должно быть FrameLayout или FrameLayout производных макетов.
Весь мой код:
1) SettingsActivity.java
**
public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment);
Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar2);
mToolbar.setTitle("Settings");
//// remove the left margin from the logo
mToolbar.setPadding(2, 0, 0, 0);//for tab otherwise give space in tab
mToolbar.setContentInsetsAbsolute(0, 0);
setSupportActionBar(mToolbar);
// Display the fragment as the main content
getFragmentManager().beginTransaction()
.replace(R.id.blankFragment, new SettingsFragment())
.commit();
}
}
**
2) activity_fragment.xml
**
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="horizontal">
<!--scroll|snap-->
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/statusbar"
android:minHeight="?attr/actionBarSize"
app:theme="@style/ThemeOverlay.AppCompat.ActionBar" />
<FrameLayout
android:id="@+id/blankFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="?attr/actionBarSize"
android:layout_gravity="top"
android:fitsSystemWindows="true"
android:orientation="horizontal" />
</FrameLayout>
**
Вы можете увидеть мой экран после того, как я заменил FrameLayout View на Fragment View
![введите описание изображения здесь]()
Ответ 5
У меня есть два вида деятельности и прикрепляю к ним один фрагмент. В первом упражнении оно отображается справа, а во втором перекрывается панелью инструментов. Хотя android:layout_marginTop="?android:attr/actionBarSize"
в макете фрагмента может быть решением, я обнаружил ошибку.
Поскольку Kotlin кэширует идентификаторы видов макетов (вместо findViewById(R.id.some_id)
вы можете написать some_id
), возникает большая проблема. Каждый раз, когда вы копируете упражнение или фрагмент, вы должны быть очень осторожны. Поэтому каждый раз проверяйте свой импорт и прикрепленные макеты.
Я скопировал FirstActivity в SecondActivity, скопировал activity_first в activity_second, но забыл изменить:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_first) // Don't forget to change.
Аналогично, во фрагменте не забудьте:
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_yours, container, false)
Итак, при импорте у меня было:
import kotlinx.android.synthetic.main.activity_second.*
В этом случае toolbar
ссылается на Activity_second, тогда как Activity_first фактически был присоединен. Затем фрагмент переместился вверх - чуть ниже панели инструментов. В большинстве случаев Kotlin никогда не показывает никаких проблем с кэшированными идентификаторами во время компиляции или выполнения. Это большая боль.