Навигация по ящикам с текстовым представлением и списком

Я пытаюсь включить TextView в стандартную навигацию по ящикам для Android. Но я действительно не знаю, как его использовать. Это то, что у меня есть до сих пор.

<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">

    <!-- As the main content view, the view below consumes the entire
         space available using match_parent in both dimensions. -->
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" 

    <LinearLayout
        android:layout_width="240dp"
        android:layout_height="match_parent" 
        android:gravity="left"
        >

        <TextView
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:text="Algemeen"
            android:background="@drawable/title_menu"
            android:textColor="#94A1A1"
            android:textAppearance="?android:attr/textAppearanceListItemSmall"
            android:minHeight="?android:attr/listPreferredItemHeightSmall"  
            android:layout_weight="1"  
            android:gravity="start"     
        />  

        <ListView
            android:id="@+id/left_drawer"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:choiceMode="singleChoice"
            android:divider="@android:color/transparent"
            android:dividerHeight="0dp"
            android:background="#323232"
            android:layout_weight="1"
            android:gravity="start"
        />

    </LinearLayout>

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

Я получаю сообщение об ошибке: No drawer view found with absolute gravity LEFT. Может ли кто-нибудь помочь мне?


person user6827    schedule 02.07.2013    source источник
comment
androiddevelopersolution.com/2013/04/   -  person Shani Goriwal    schedule 02.07.2013


Ответы (2)


Я думаю, что проблема заключается в android:gravity="left" в линейном макете. Документы рекомендуют использовать layout_gravity="start" и это должно соответствовать вашему требованию.

person abhinav agarwal    schedule 08.08.2013

Создайте макет ящика

Чтобы добавить навигационный ящик, объявите свой пользовательский интерфейс с помощью объекта aDrawerLayout в качестве корневого представления вашего макета. Внутри theDrawerLayout добавьте одно представление, содержащее основное содержимое экрана (ваш основной макет, когда ящик скрыт), и другое представление, содержащее содержимое навигационного ящика.

<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">
<FrameLayout
android:id="@+id/content_frame"
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:background="#111"/>
</android.support.v4.widget.DrawerLayout>

Этот макет демонстрирует некоторые важные характеристики макета: основное представление содержимого (вышеприведенный FrameLayout) должно быть первым дочерним элементом в DrawerLayout, поскольку порядок XML подразумевает z-упорядочение, а рисовальщик должен располагаться поверх содержимого. Основное представление контента настроено так, чтобы соответствовать ширине и высоте родительского представления, поскольку оно представляет весь пользовательский интерфейс, когда панель навигации скрыта. Представление ящика (ListView) должно указывать свою горизонтальную гравитацию с помощью атрибута android:layout_gravity. Для поддержки языков с письмом справа налево (RTL) укажите значение с «start» вместо «left» (чтобы ящик отображался справа, когда макет RTL). Вид ящика указывает свою ширину в единицах dp, а высота соответствует родительскому виду. Ширина ящика не должна превышать 320 dp, чтобы пользователь всегда мог видеть часть основного содержимого. Инициализировать список ящиков и расположение ящиков

Во-первых, вам нужно инициализировать список ящиков и макет ящика. Затем нужно установить значения для списка с помощью адаптера.

mColors = getResources().getStringArray(R.array.colors_array);
mDrawerLayout=(DrawerLayout)findViewById(R.id.drawer_layout);
mDrawerList=(ListView)findViewById(R.id.left_drawer);

Слушайте события открытия и закрытия

Чтобы прослушивать события открытия и закрытия ящика, вызовите setDrawerListener() в вашем DrawerLayout и передайте ему реализацию DrawerLayout.DrawerListener. Этот интерфейс обеспечивает обратные вызовы для событий ящика, таких как onDrawerOpened() и onDrawerClosed().

mDrawerToggle=new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close){
public void onDrawerClosed(View view) {
getActionBar().setTitle(mTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(mDrawerTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
};

Обработка событий кликов навигации

Когда пользователь выбирает элемент в списке ящика, система вызывает onItemClick() для прослушивателя OnItemClickListener, заданного для setOnItemClickListener().

public class DrawerItemClickListener implements OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) {
// TODO Auto-generated method stub
selectItem(position);
}
}
private void selectItem(int position){
Fragment fragment=new ColorsFragment();
Bundle bundle=new Bundle();
bundle.putInt("Position", position);
fragment.setArguments(bundle);
FragmentManager fragmentManager=getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();
Toast.makeText(this, position+"", Toast.LENGTH_SHORT).show();
mDrawerList.setItemChecked(position, true);
setTitle(mPlanetTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
}

в selectItem() вы должны вызвать связанный фрагмент с заданной позицией. Здесь я создал простой фрагмент и изменил цвет фона и текст в зависимости от введенного ввода.

public class ColorsFragment extends Fragment{
private int[] colors;
private int position;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootview=inflater.inflate(R.layout.fragment_layout, container,false);
position=getArguments().getInt("Position");
RelativeLayout layout=(RelativeLayout)rootview.findViewById(R.id.layout);
TextView textView=(TextView)rootview.findViewById(R.id.textview);
colors=getActivity().getResources().getIntArray(R.array.colors);
textView.setText(getResources().getStringArray(R.array.colors_array)[position]);
layout.setBackgroundColor(colors[position]);
return rootview;
}
}

При использовании ActionBarDrawerToggle вы должны вызывать его во время onPostCreate() и onConfigurationChanged().

@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggls
mDrawerToggle.onConfigurationChanged(newConfig);
}

Для получения дополнительной информации посетите: http://velmurugandroidcoding.blogspot.in/2014/09/navigation-drawer-in-android.html

person user3921740    schedule 05.09.2014
comment
Не было бы более гуманным просто опубликовать ссылку на документацию, а не копировать/вставлять все это (и пытаться получить за это баллы...)? - person ygesher; 01.02.2015