Как изменить стиль текста навигационного ящика при использовании шаблона проекта Android?

У меня есть одно приложение, в котором я использовал это руководство: http://developer.android.com/training/implementing-navigation/nav-drawer.html

Сейчас я работаю над новым проектом, в котором я выбрал шаблон активности ящика навигации:

введите здесь описание изображения

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

Макет панели навигации выглядит следующим образом:

<ListView 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:background="#cccc"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
tools:context="com.example.appname.NavigationDrawerFragment" />

В MainActivity в учебнике вы можете установить drawer_list_item в адаптере mDrawerList:

mPlanetTitles = getResources().getStringArray(R.array.planets_array);
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, mPlanetTitles));
// Set the list's click listener
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

В шаблоне все делается иначе:

mNavigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
mTitle = getTitle();

// Set up the drawer.
mNavigationDrawerFragment.setUp(R.id.navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout));

Я попытался вручную создать ссылку на макет навигационного ящика и установить адаптер, но все, что произошло, это то, что мои заголовки стали пустыми.

Кому-нибудь удалось это сделать успешно? Будь проклят Google за создание шаблона, который работает совершенно иначе, чем их учебник!


person Leon    schedule 29.08.2014    source источник


Ответы (2)


У меня была такая же проблема, вот простой пример на github: добавлен в ящик навигации Адаптер для строки Значок, имя, номер

https://github.com/ManolescuSebastian/Android-Mail-App/tree/master/app/src/main/java/ro/softwareinclude/android_mail_app/adapter

Полезный код, который вам нужен:

Фрагмент NavigationDrawer:

 //Pop navigation drawer item list
 List<InstantMailNavigationItem> navigationDrawerMapElementsList = new ArrayList<InstantMailNavigationItem>();
 String [] navigationItemNameArray= getResources().getStringArray(R.array.instantNavigationItemName);
 TypedArray images = getResources().obtainTypedArray(R.array.instantNavigationItemIcon);
 for(int i=0;i<5;i++){
    InstantMailNavigationItem instantMailNavigationItems = new InstantMailNavigationItem();
    instantMailNavigationItems.setItemName(navigationItemNameArray[i]);
    instantMailNavigationItems.setItemImageResource(getResources().getDrawable(images.getResourceId(i,-1)));
    navigationDrawerMapElementsList.add(instantMailNavigationItems);
   }
    NavigatorAdapter navigatorAdapter = new NavigatorAdapter(getActionBar().getThemedContext(), navigationDrawerMapElementsList);
    mDrawerListView.setAdapter(navigatorAdapter);

Класс адаптера:

public class NavigatorAdapter extends ArrayAdapter {

 private Context context;
 private ViewHolder holder;
 private List<InstantMailNavigationItem> navigationDrawerElements;
 public NavigatorAdapter(Context context, List<InstantMailNavigationItem>  instantMailNavigationItems) {
 super(context, R.layout.navigator_adapter,instantMailNavigationItems);
 this.context = context;
 this.navigationDrawerElements = instantMailNavigationItems;
}

 /**
 * getView method is called for each item of ListView
 */
 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
     InstantMailNavigationItem navigationItem = navigationDrawerElements.get(position);
     LayoutInflater inflater = (LayoutInflater)          context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     convertView = inflater.inflate(R.layout.navigator_adapter, null);
     holder = new ViewHolder();
     init(convertView,holder);
     holder.navDrawerItemName.setText(navigationItem.getItemName());
     holder.navDrawerItemIcon.setImageDrawable(navigationItem.getItemImageResource());
     return convertView;
     }

     public void init(View convertView, ViewHolder holder) {
     holder.navDrawerItemIcon = (ImageView)    convertView.findViewById(R.id.navDrawerItemIcon);
     holder.navDrawerItemName = (TextView)        convertView.findViewById(R.id.navDrawerItemName);
     holder.navDrawerItemNumber = (TextView) convertView.findViewById(R.id.navDrawerItemNumber);
     }

    static class ViewHolder{
      ImageView navDrawerItemIcon;
      TextView navDrawerItemName;
      TextView navDrawerItemNumber;
    }
  }
person MSA    schedule 29.08.2014
comment
Я ценю усилия, но я действительно не вижу, как я могу применить это, не переделывая большую часть моего кода. Было бы проще просто вернуться к коду в их учебнике. - person Leon; 30.08.2014

Хорошо, я нашел ответ, вчера я явно плохо искал.

Настройка панели навигации теперь выполняется в классе фрагментов панели навигации:

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

    ///yada yada yada

    mDrawerListView.setAdapter(new ArrayAdapter<String>(getActionBar()
            .getThemedContext(), android.R.layout.simple_list_item_1,
            android.R.id.text1, new String[] {
                    getString(R.string.title_section1),
                    getString(R.string.title_section2),
                    getString(R.string.title_section3),}));
    mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
    return mDrawerListView;
}

Поэтому мне просто пришлось изменить свой ресурс макета в ArrayAdapter:

mDrawerListView.setAdapter(new ArrayAdapter<String>(getActionBar()
            .getThemedContext(), R.layout.drawer_list_item,
            android.R.id.text1, new String[] {
person Leon    schedule 30.08.2014