http://developer.android.com/design/patterns/navigation-drawer.html
チュートリアルを読んでナビゲーション ドロワーを作成しましたが、タイトル、アイコン、カウンターをドロワー アイテムの一部として使用するにはどうすればよいですか? この例では、テキストを制御する方法のみを示しています。
http://developer.android.com/design/patterns/navigation-drawer.html
チュートリアルを読んでナビゲーション ドロワーを作成しましたが、タイトル、アイコン、カウンターをドロワー アイテムの一部として使用するにはどうすればよいですか? この例では、テキストを制御する方法のみを示しています。
特定のレイアウトでナビゲーション ドロワー UI を管理する必要があります。アクティビティ レイアウトをナビゲーション ドロワー レイアウトでラップしてリストビューを追加したら、新しい layout.xml を作成する必要があります (必要なものをすべてラップして追加し、最初のリストビューでこのレイアウトを指定します。
レイアウト例 : https://gist.github.com/jordanblt/6220779
タイトルに関するより具体的な回答:ナビゲーション ドロワー レイアウトにタイトルを追加するには?
この回答は、すでに動作しているナビゲーション ドロワーがあり、アイコンとカウントを追加するだけでよいことを前提としています。
これが私のやり方です。ニュースアプリを例にとってみましょう。ナビゲーション ドロワーにはLocal News
、Foreign News
とがありAlien News
ます。アイコン、タイトル、およびカウンターが必要なのは、カスタム アダプターとモデル クラスを定義することです。
モデルクラス:
public class NavDrawerItem {
private String title;
private int icon;
private int count;
private boolean isLocalNews;
private boolean isForeignNews;
private boolean isAlienNews;
private boolean hasIcon;
private boolean isCounterVisible = false; // boolean to set visibility of the counter
public NavDrawerItem(){}
public NavDrawerItem(String title, boolean hasICon, int icon, boolean isCounterVisible,
boolean isLocalNews, boolean isForeignNews, boolean isAlienNews) {
this.title = title;
this.hasIcon = hasICon;
this.icon = icon;
this.isCounterVisible = isCounterVisible;
this.setHasIcon(isHasIcon());
this.isLocalNews = isLocalNews;
this.isForeignNews = isForeignNews;
this.isAlienNews = isAlienNews;
}
public String getTitle(){
return this.title;
}
public int getIcon(){
return this.icon;
}
public int getCount(){
return this.count;
}
public boolean getCounterVisibility(){
return this.isCounterVisible;
}
public void setTitle(String title){
this.title = title;
}
public void setIcon(int icon){
this.icon = icon;
}
public void setCount(int count){
this.count = count;
}
public void setCounterVisibility(boolean isCounterVisible){
this.isCounterVisible = isCounterVisible;
}
public boolean isLocalNews() {
return isLocalNews;
}
public boolean isForeignNews() {
return isLocalNews;
}
public boolean isAlienNews() {
return isAlienNews;
}
public boolean isHasIcon() {
return hasIcon;
}
public void setHasIcon(boolean hasIcon) {
this.hasIcon = hasIcon;
}
}
次に、カスタム アダプターで次のようにします。
public class NavDrawerListAdapter extends BaseAdapter {
private Context context;
private ArrayList<NavDrawerItem> navDrawerItems;
public NavDrawerListAdapter(Context context, ArrayList<NavDrawerItem> navDrawerItems){
this.context = context;
this.navDrawerItems = navDrawerItems;
}
@Override
public int getCount() {
return navDrawerItems.size();
}
@Override
public Object getItem(int position) {
return navDrawerItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater mInflater = (LayoutInflater)
context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.drawer_list_item, null);
}
ImageView imgIcon = (ImageView) convertView.findViewById(R.id.icon);
TextView txtTitle = (TextView) convertView.findViewById(R.id.title);
TextView countTxt = (TextView) convertView.findViewById(R.id.debtCounter);
imgIcon.setImageResource(navDrawerItems.get(position).getIcon());
//I am getting the count of each news item from a database,
//for this purpose just initialize them to any random number e.g
//localNewsCount = 56
int localNewsCount = databaseManager.getAllLocalNews().size();
int foreignNewsCount = databaseManager.getForeignNews().size();
int alienNewsCount = databaseManager.getAllAlienNews().size();
txtTitle.setText(navDrawerItems.get(position).getTitle());
// To display the count (number of news per item) in the navigation drawer,
//first check whether count textview is set to visible or not. True means the item can have a counter
if(navDrawerItems.get(position).getCounterVisibility() && navDrawerItems.get(position).isLocalNews()) {
navDrawerItems.get(position).setCount(localNewsCount);
countTxt.setText(String.valueOf(navDrawerItems.get(position).getCount()));
}
if(navDrawerItems.get(position).getCounterVisibility() && navDrawerItems.get(position).isForeignNews()){
navDrawerItems.get(position).setCount(foreignNewsCount);
countTxt.setText(String.valueOf(navDrawerItems.get(position).getCount()));
}
if(navDrawerItems.get(position).getCounterVisibility() && navDrawerItems.get(position).isAlienNews()){
navDrawerItems.get(position).setCount(alienNewsCount);
countTxt.setText(String.valueOf(navDrawerItems.get(position).getCount()));
}
if(!navDrawerItems.get(position).getCounterVisibility()) {
countTxt.setVisibility(View.GONE);
}
if (!navDrawerItems.get(position).isHasIcon()) {
imgIcon.setVisibility(View.GONE);
}
return convertView;
}
}
そして、アクティビティで次のように項目を初期化します。
// load slide menu items
navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
// nav drawer icons from resources
TypedArray navMenuIcons = getResources()
.obtainTypedArray(R.array.nav_drawer_icons);
ArrayList<NavDrawerItem> navDrawerItems = new ArrayList<>(); //Create an array of navigation drawer items.
//local news
navDrawerItems.add(new NavDrawerItem(
navMenuTitles[0], //Title
true, //hasIcon
navMenuIcons.getResourceId(0, -1), //Icon resource
true, //is counter visible?
true) //is localNews?
false) //is foreignNews?
false) //is alienNews?
);
//Foreign news
navDrawerItems.add(new NavDrawerItem(
navMenuTitles[1], //Title
true, //hasIcon
navMenuIcons.getResourceId(1, -1), //Icon resource
true, //is counter visible?
false) //is localNews?
true) //is foreignNews?
false) //is alienNews?
);
//Alien news, since we know nothing about aliens we won't add icons and counter
navDrawerItems.add(new NavDrawerItem(
navMenuTitles[2], //Title
false, //hasIcon
navMenuIcons.getResourceId(2, -1), //Icon resource
false, //is counter visible?
false) //is localNews?
false) //is foreignNews?
true) //is alienNews?
);
文字列リソース ファイルに次を追加します。
<array name="nav_drawer_icons">
<item>@drawable/ic_localnews</item>
<item>@drawable/ic_foreignnews</item>
<item>@drawable/ic_aliensnews</item>
</array>
<!-- Nav Drawer Menu Items -->
<string-array name="nav_drawer_items">
<item> Local News </item>
<item> Foreign News </item>
<item> Alien News </item>
</string-array>