6

http://developer.android.com/design/patterns/navigation-drawer.html

チュートリアルを読んでナビゲーション ドロワーを作成しましたが、タイトル、アイコン、カウンターをドロワー アイテムの一部として使用するにはどうすればよいですか? この例では、テキストを制御する方法のみを示しています。

4

2 に答える 2

1

特定のレイアウトでナビゲーション ドロワー UI を管理する必要があります。アクティビティ レイアウトをナビゲーション ドロワー レイアウトでラップしてリストビューを追加したら、新しい layout.xml を作成する必要があります (必要なものをすべてラップして追加し、最初のリストビューでこのレイアウトを指定します。

レイアウト例 : https://gist.github.com/jordanblt/6220779

タイトルに関するより具体的な回答:ナビゲーション ドロワー レイアウトにタイトルを追加するには?

于 2013-08-13T12:52:20.327 に答える
0

この回答は、すでに動作しているナビゲーション ドロワーがあり、アイコンとカウントを追加するだけでよいことを前提としています。

これが私のやり方です。ニュースアプリを例にとってみましょう。ナビゲーション ドロワーにはLocal NewsForeign 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>
于 2015-08-19T10:43:06.057 に答える