Использование DrawerLayout вместе с ListView

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

Вот как выглядит главный экран: введите здесь описание изображения

А вот как выглядит меню ящика: введите здесь описание изображения

Проблема, с которой я сталкиваюсь, заключается в том, что когда я открываю меню бокового ящика и нажимаю на параметр, он не работает, и меню просто закрывается. Однако я могу взаимодействовать с главной страницей списка. Вот как выглядит мой код:

String[] homeArray = { "Test", "Test", "Test", "Test", "Test", "Test", "Test", "Test", "Test", "Test", "Test", "Test", "Test", "Test", "Test" };

private ListView homeListView;
private ArrayAdapter arrayAdapter;



private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;

private CharSequence mDrawerTitle;
private CharSequence mTitle;
private String[] mDrawerTitles;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    mTitle = mDrawerTitle = getTitle();
    mDrawerTitles = getResources().getStringArray(R.array.Menu);
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) findViewById(R.id.left_drawer);

    // Set the adapter for the list view
    mDrawerList.setAdapter(new ArrayAdapter<String>(this,
            R.layout.drawer_list_item, mDrawerTitles));

И файл activity_main.xml:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    >

<FrameLayout
    android:id="@+id/content_frame"
    android:layout_height="match_parent"
    android:layout_width="match_parent" />

<ListView
    android:id="@+id/left_drawer"
    android:layout_height="match_parent"
    android:layout_width="240dp"
    android:layout_gravity="start"
    android:choiceMode="singleChoice"
    android:divider="@android:color/darker_gray"
    android:dividerHeight="1dp"
    android:background="#111"
    />
 <LinearLayout 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"
              android:orientation="vertical"
              tools:context=".ListActivity" >

<ListView
        android:id="@+id/homeListView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
</ListView>

</LinearLayout>

</android.support.v4.widget.DrawerLayout>

У меня есть ощущение, что проблема в xml, но я не уверен.


person Plays2    schedule 23.08.2013    source источник
comment
Вам нужно будет опубликовать полный код вашего ящика.   -  person Philipp Jahoda    schedule 24.08.2013


Ответы (1)


Пожалуйста, опубликуйте полный код вашей деятельности, которая содержит NavigationDrawer.

Кроме того, я настоятельно рекомендую (как и Google) использовать фрагменты для отдельных разделов NavigationDrawer ("Настройки", "Сообщить об ошибке" и "Справка" в вашем случае).

Не помещайте все компоненты макета в файл макета вашего действия.

Таким образом, макет должен выглядеть следующим образом:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- The main content view -->
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <!-- The navigation drawer -->
    <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:background="#111"/>
</android.support.v4.widget.DrawerLayout>

FrameLayout content_frame — это место, куда войдет ваш фрагмент, содержащий ListView. Просто создайте собственный фрагмент (или используйте ListFragment), который содержит ListView, отображаемый на изображении, и вставьте его в «content_frame». .

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

/** Swaps fragments in the main content view */
private void selectItem(int position) {
    // Create a new fragment and specify the planet to show based on position
    Fragment fragment = new YourListFragment(); // this fragment contains the list with all the "test" items

    // Insert the fragment by replacing any existing fragment
    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction()
                   .replace(R.id.content_frame, fragment)
                   .commit();

    // Highlight the selected item, update the title, and close the drawer
    mDrawerList.setItemChecked(position, true);
    setTitle(mPlanetTitles[position]);
    mDrawerLayout.closeDrawer(mDrawerList);
}

Пример того, как может выглядеть ваш фрагмент: YourListFragment.java Файл макета "list_fragment.xml" просто содержит любые компоненты макета, которые вы хотите. Например, ListView. Инициализируйте заполнение ListView внутри метода Fragments onCreateView().

public class YourListFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.list_fragment, container, false);

        return rootView;
    }
}

Все взято из примера Google о том, как создать NavigationDrawer:

http://developer.android.com/training/implementing-navigation/nav-drawer.html

person Philipp Jahoda    schedule 23.08.2013
comment
Спасибо за быстрый ответ! Однако один вопрос... должен ли я импортировать android.app.Fragment или android.support.v4.app.Fragment - person Plays2; 24.08.2013
comment
Это зависит от того, где вы хотите использовать свой фрагмент. Что касается этого примера, то можно использовать стандартный android.app.Fragment, а не библиотеку поддержки. - person Philipp Jahoda; 24.08.2013