Выдвижной ящик появляется во всех видах деятельности
Я разрабатываю приложение, которое содержит много действий, и я создал свое собственное меню (я не хочу использовать встроенную кнопку меню) с выдвижным ящиком, так как выдвижной ящик находится в нижней части экрана и содержит кнопки моего меню
мне нужно, чтобы этот выдвижной ящик появлялся во всех моих действиях
Я попытался создать действие и установить его представление содержимого для файла XML, который включает в себя ящик, а затем расширяет это действие во всех других действиях, но это решение не работает
так какие-нибудь предложения?
3 ответа
Расширение - это правильный путь. Просто переопределите setContentView в правильном направлении. Вот рабочий пример, но вместо ящика я использую созданную пользовательскую панель вкладок:
Определите макет со своим ящиком следующим образом:
это act_layout.xml
<LinearLayout
...
android:orientation="vertical"
>
<YourDrawer
...
/>
<FrameLayout
android:id="@+id/act_content"
...
>
// Here will be all activity content placed
</FrameLayout>
</LinearLayout>
Это будет ваш базовый макет, содержащий все остальные макеты во фрейме act_content. Затем создайте базовый класс действий и выполните следующие действия:
public abstract class DrawerActivity extends Activity {
protected LinearLayout fullLayout;
protected FrameLayout actContent;
@Override
public void setContentView(final int layoutResID) {
// Your base layout here
fullLayout= (LinearLayout) getLayoutInflater().inflate(R.layout.act_layout, null);
actContent= (FrameLayout) fullLayout.findViewById(R.id.act_content);
// Setting the content of layout your provided to the act_content frame
getLayoutInflater().inflate(layoutResID, actContent, true);
super.setContentView(fullLayout);
// here you can get your drawer buttons and define how they
// should behave and what must they do, so you won't be
// needing to repeat it in every activity class
}
}
То, что мы делаем, в основном перехватывает все вызовы setContentView(int resId), раздувает наш макет для ящика из xml, раздувает наш макет для активности (с помощью reId, предоставляемого в вызове метода), объединяет их по мере необходимости и устанавливает в качестве contentView для активность.
РЕДАКТИРОВАТЬ: После того, как вы создали материал, описанный выше, просто приступайте к написанию приложения как обычно, создавайте макеты (без какого-либо упоминания о выдвижном ящике), создавайте действия, но вместо расширения простого действия расширяйте DrawerActivity, например, так:
public abstract class SomeActivity extends DrawerActivity {
protected void onCreate(Bundle bundle) {
setContentView(R.layout.some_layout);
}
}
Что происходит, так это то, что setContentView(R.layout.some_layout) перехватывается. Ваша DrawerActivity загружает предоставленный вами макет из xml, загружает стандартный макет для вашего ящика, объединяет их и затем устанавливает его как contentView для действия.
Наконец, через 3 года, вот полное решение этого важного вопроса, для которого, возможно, не полностью руководствовался ответ г-на Орлова.
Его метод создания иерархического представления был полностью нормальным, но были небольшие ошибки, которые могут ввести в заблуждение начинающих разработчиков.
- Как также упоминал Гейб, вы можете избавиться от абстрактного в объявлении.
- Там нет необходимости, чтобы обернуть обоих детей с FrameLayout. Родителем может быть что угодно RelativeLayout, LinearLayout и т. Д. Но наиболее важной частью является то, что вы должны объявить FrameLayout перед Slider.
Таким образом, 100% рабочее решение будет выглядеть так:
activity_drawer.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<FrameLayout
android:id="@+id/drawer_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<YourDrawer
android:id="@+id/drawer_drawer"
android:layout_width="match_parent"
android:layout_height="fill_parent" >
</YourDrawer>
</RelativeLayout>
DrawerActivity.java
public class DrawerActivity extends Activity {
protected RelativeLayout fullLayout;
protected FrameLayout frameLayout;
@Override
public void setContentView(int layoutResID) {
fullLayout = (RelativeLayout) getLayoutInflater().inflate(R.layout.activity_drawer, null);
frameLayout = (FrameLayout) fullLayout.findViewById(R.id.drawer_frame);
getLayoutInflater().inflate(layoutResID, frameLayout, true);
super.setContentView(fullLayout);
//Your drawer content...
}
}
MainActivity.java
public class MainActivity extends DrawerActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Не забудьте объявить DrawerActivity в манифесте.
Надеюсь, это помогло.
Я знаю, что это на два года позже, но для тех, кто хотел бы получить ответ, вот он. У г-на Орлова был соответствующий ответ, всего лишь несколько корректировок.
- удалить реферат после публикации. (это то, что вызывает ошибку)
- оберните оба ваших выдвижных ящика и FrameLayout с другим FrameLayout и установите ширину и высоту match_parent. (Это позволяет ОБА макетов появляться).
ТАКЖЕ: Если вы хотите, чтобы ваш выдвижной ящик отображался поверх макета (дух!), Тогда поместите frameLayout, который находится после slideDrawer, перед slideDrawer.