выдвижной ящик появляется во всех видах деятельности - PullRequest
16 голосов
/ 07 февраля 2011

Я занимаюсь разработкой приложения, которое содержит множество действий и я создал свое собственное меню (я не хочу использовать встроенную кнопку меню) с выдвижным ящиком так как выдвижной ящик находится внизу экрана и содержит кнопки моего меню

мне нужно, чтобы этот выдвижной ящик появлялся во всех моих действиях

Я попытался создать действие и установить его представление содержимого для файла XML, который включает в себя ящик, а затем распространить это действие на все остальные действия, но это решение не работает

так какие-нибудь предложения?

Ответы [ 3 ]

41 голосов
/ 07 февраля 2011

Расширение - правильный путь. Просто переопределите 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 действия.

EDIT: После того, как вы создали материал, описанный выше, просто приступайте к написанию приложения как обычно, создавайте макеты (без какого-либо упоминания о ящике), создавайте действия, но вместо расширения простого действия расширяйте 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 для действия.

13 голосов
/ 16 сентября 2014

Наконец, через 3 года, вот полное решение этого важного вопроса, для которого, возможно, не был полностью ориентирован ответ г-на Орлова.

Его метод создания иерархического представления был полностью нормальным, но были небольшие ошибки, которые могут ввести в заблуждение начинающих разработчиков.

  1. Как также упоминал Гейб, вы можете избавиться от абстрактного в объявлении.
  2. Нет необходимости оборачивать обоих детей в 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 в манифесте.

Надеюсь, это помогло.

2 голосов
/ 04 июня 2013

Я знаю, что это на два года позже, но для тех, кто хотел бы получить ответ, вот он. У г-на Орлова был соответствующий ответ, всего лишь несколько корректировок.

  • удалить реферат после публикации. (это то, что вызывает ошибку)
  • оберните ваш выдвижной ящик и FrameLayout другим FrameLayout и установите ширину и высоту в match_parent. (Это позволяет отображать ОБА макеты).

ТАКЖЕ: Если вы хотите, чтобы ваш выдвижной ящик отображался поверх макета (дух!), Тогда поместите frameLayout, который находится после slideDrawer, перед slideDrawer.

...