2013-06-12 2 views
17

私はこの質問に対する答えをウェブで精査しましたが、公式のAndroidの文書でさえ見つけられないようです。Androidナビゲーションボックスにアイコンを追加しますか?

私はAndroidの新しいナビゲーションドローイングのレイアウトを実装するアプリケーションを作成しています。このレイアウトの文書はherehereです。

デザインドキュメントや、FacebookやGoogleカレントなどの人気アプリでは、引き出しアイテムの前にアイコンが表示されます。

設計文書自体は

ナビゲーションターゲットはオプションの先頭のアイコンだけでなく、後続のカウンターを持つことができる「ナビゲーションドロワーの内容」の下で、それらを言及しています。カウンターを使用して、対応するビューのデータの変更された状態をユーザーに通知します。

残念ながら、デベロッパーのドキュメントでは、この設定でアイコンを実装する方法については言及していません。それはそうと、項目のリストを実装する方法について説明します。

public class MainActivity extends Activity { 
private String[] mPlanetTitles; 
private ListView mDrawerList; 
... 

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

    mPlanetTitles = getResources().getStringArray(R.array.planets_array); 
    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()); 

    ... 
} 
} 

その実装は、getStringArrayの()を使用しているので、私はアイコンが含まれるように、行項目のXMLを変更すると考えることができます方法はありません。

多くのアプリが各テキスト項目の前にアイコンを実装しているようで、Designドキュメントはアイコンを追加することを参照するため、これは困惑しています。私はこれらのアイコンを追加するための簡単なAPI呼び出しが必要であると感じていますが、今まで見つかった唯一の実装は非常に複雑です。

ナビゲーションの引き出しアイテムにアイコンを追加する方法を知っている人はいますか?単純なAPIコールでこれを行う方法はありますか、これらの企業(Facebook、Googleなど)はすべて問題をハックする方法を見つけなければなりませんでしたか?

ありがとうございました。

+0

これはこれまでに分類されていますか?もしそうなら、共有を心がけてください。 –

答えて

7

これらの実装ではgetStringArray()を使用しているため、アイコンを含むように行項目のxmlを変更する方法はありません。

ListAdapterのモデルデータを選択しても、そのListAdapterによって作成された行にアイコンが付いているかどうかには何の影響もありません。

ナビゲーションの引き出しアイテムにアイコンを追加する方法を知っている人はいますか?

ListAdapterの行レイアウトにImageViewを入れてください。 ArrayAdaptergetView()を上書きするなど、ListAdapterImageViewを入力してください。 IOWは、これまで何年もされてきたように、他のListViewと同じようにします。

「シンプル」と「APIの呼び出し」のあなたの定義に依存し、単純なAPI呼び出し

でこれを行う方法はあります。

3

文字列配列は、行の定義レイアウトではありません。 R.layout.drawer_list_itemは、リストの各行のレイアウトを表します。イメージ(または他の複雑な行レイアウト)を含める場合は、R.layout.drawer_list_item xmlを置き換えるカスタムレイアウトxmlにイメージビューを含めます。

イメージまたはテキストをそれぞれの異なる行に設定する方法は、アレイアダプタのgetView()メソッドで行います。粗例は、(行でのTextViewとImageViewのがあると仮定して)次のようである:それぞれの行のビューを実装する

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    convertView = inflater.inflate(R.layout.revise_listview, parent,false); 

    TextView tv = (TextView)convertView.findViewById(R.id.text); 
    ImageView iv = (ImageView)convertView.findViewById(R.id.image); 

    tv1.setText(stringArray.get(i)); 
    if(//condition) { 
     iv.setImageResource(R.drawable.imagexx); 
    } 
    return convertView; 
} 

、より効率的な方法は、viewholderパターンを使用しています。例を見つけることができる多くの場所の1つがhereです。

6

のようなアダプタクラスを作成します。..

public class AdapterClass extends ArrayAdapter<String> { 
Context context; 
private ArrayList<String> TextValue = new ArrayList<String>(); 

public AdapterClass(Context context, ArrayList<String> TextValue) { 
    super(context, R.layout.row_of_drawer, TextValue); 
    this.context = context; 
    this.TextValue= TextValue; 

} 


@Override 
public View getView(int position, View coverView, ViewGroup parent) { 
    // TODO Auto-generated method stub 

    LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View rowView = inflater.inflate(R.layout.row_of_drawer, 
      parent, false); 

    TextView text1 = (TextView)rowView.findViewById(R.id.text1); 
    text1.setText(TextValue.get(position)); 

    return rowView; 

} 

} 

そして、あなたのMainActivityのいくつかの変更を作成します。

使用

AdapterClass adClass = new AdapterClass(MainActivity.this, name_of_arrayList); 

    mDrawerList.setAdapter(adClass); 

が本当にはっきりと私はNavigationItemの配列からすべてを生成したオブジェクト指向の実装のためのコードのいくつかの余分な行をしたこの構造に

mDrawerList.setAdapter(new ArrayAdapter<String>(this, 
     R.layout.drawer_list_item, mPlanetTitles)); 
3

のinsted - メニュー項目のテキスト、アイコン、およびフラグメントのフィールドを含むプレーンなJavaクラス。

マイ・ナビゲーションは単純に定義されていますアレイによる:

NavigationAdapter navigationMenuAdapter; 
NavigationItem[] navigationMenuItems = { 
    new NavigationItem(R.string.menu_home, R.drawable.ic_menu_home, new MainFragment()), 
    new NavigationItem(R.string.menu_statistics, R.drawable.ic_statistics, new StatisticsFragment()), 
    new NavigationItem(R.string.menu_settings, R.drawable.ic_settings, new SettingsFragment()), 
}; 

protected void onCreate(Bundle savedInstanceState) { 
    ... 
    navigationMenuAdapter = new NavigationAdapter(this, navigationMenuItems); 
    mDrawerList.setAdapter(navigationMenuAdapter); 
} 

... 
private void selectItem(int position) { 
    // Insert the fragment by replacing any existing fragment 
    FragmentManager fragmentManager = getFragmentManager(); 
    fragmentManager.beginTransaction() 
        .replace(R.id.content_frame, navigationMenuItems[position].fragment) 
        .commit(); 

    mDrawerList.setItemChecked(position, true); 
    setTitle(navigationMenuItems[position].stringTitle); 
    mDrawerLayout.closeDrawer(mDrawerList); 
} 

NavigationItemクラス:

public class NavigationItem 
{ 
    /** 
    * 
    * @param stringTitle The id of the string resource of the text of the item. 
    * @param drawableIcon The id of the drawable resource of icon of the item. 
    * @param fragment The Fragment to be loaded upon selecting the item. 
    */ 
    public NavigationItem(int stringTitle, int drawableIcon, Fragment fragment) 
    { 
     this.stringTitle = stringTitle; 
     this.drawableIcon = drawableIcon; 
     this.fragment = fragment; 
    } 

    /** 
    * The id of the string resource of the text of the item. 
    */ 
    public int stringTitle; 

    /** 
    * The id of the drawable resource of icon of the item. 
    */ 
    public int drawableIcon; 

    /** 
    * The Fragment to be loaded upon selecting the item. 
    */ 
    public Fragment fragment; 
} 

そしてNavigationAdapter:だけはImageViewと含まれていることを、非常に基本的なXMLレイアウト、list_item_navigationを使用しています

public class NavigationAdapter extends BaseAdapter { 
    private Context context; 
    private NavigationItem[] navigationItems; 

    public NavigationAdapter(Context context, NavigationItem[] items) { 
     this.context = context; 
     navigationItems = items; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = null; 
     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      row = inflater.inflate(R.layout.list_item_navigation, parent, false); 
     } else { 
      row = convertView; 
     } 

     TextView tvTitle = (TextView) row.findViewById(R.id.textView); 
     ImageView ivIcon = (ImageView) row.findViewById(R.id.imageView); 

     tvTitle.setText(navigationItems[position].stringTitle); 
     ivIcon.setImageResource(navigationItems[position].drawableIcon); 
     return row; 
    } 
} 

TextView

関連する問題