2013-06-12 9 views
17

मैंने इस प्रश्न के उत्तर के लिए वेब को खराब कर दिया है लेकिन आधिकारिक एंड्रॉइड दस्तावेज़ों में भी एक नहीं ढूंढ सकता है।एंड्रॉइड नेविगेशन ड्रॉवर में आइकन जोड़ें?

मैं एक ऐप बनाने की प्रक्रिया में हूं जो एंड्रॉइड के नए नेविगेशन ड्रॉवर लेआउट को लागू करता है। इस लेआउट का दस्तावेज़ीकरण here और here पाया जा सकता है।

डिज़ाइन प्रलेखन के साथ-साथ फेसबुक और Google Currents जैसे कई लोकप्रिय ऐप्स में, दराज आइटमों के सामने आइकन हैं।

डिजाइन प्रलेखन खुद उन्हें का उल्लेख है, "मार्गदर्शक ड्रॉवर की सामग्री"

नेविगेशन लक्ष्य वैकल्पिक प्रमुख प्रतीक के साथ ही अनुगामी काउंटर हो सकता है के तहत। संबंधित दृश्य में डेटा की बदली गई स्थिति के बारे में उपयोगकर्ताओं को सूचित करने के लिए काउंटर का उपयोग करें।

दुर्भाग्यवश, डेवलपर दस्तावेज़ इस सेटअप में आइकन को कार्यान्वित करने का कोई उल्लेख नहीं करता है।) उनके क्रियान्वयन getStringArray (का उपयोग करता

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()); 

    ... 
} 
} 

वजह से, वहाँ कोई रास्ता नहीं मैं के बारे में सोच सकते हैं एक आइकन शामिल करने के लिए पंक्ति आइटम की एक्सएमएल संशोधित करने के लिए है: यह बताता है कि कैसे इतनी के रूप में आइटम की सूची को लागू करने।

यह परेशान है, क्योंकि कई ऐप्स प्रत्येक टेक्स्ट आइटम से ठीक पहले आइकन लागू करने लगते हैं, और डिज़ाइन दस्तावेज़ भी आइकन जोड़ने के संदर्भ में हैं। मुझे लगता है कि इन आइकनों को जोड़ने के लिए कुछ सरल एपीआई कॉल होना चाहिए, और फिर भी मुझे अभी तक केवल एक ही कार्यान्वयन मिला है जो हास्यास्पद रूप से जटिल लगता है।

क्या कोई जानता है कि नेविगेशन ड्रॉवर आइटम में आइकन कैसे जोड़ें? क्या एक साधारण एपीआई कॉल के साथ ऐसा करने का कोई तरीका है, या इन सभी कंपनियों (फेसबुक, Google, आदि) को समस्या के आसपास हैक करने के तरीके ढूंढना पड़ा है?

सभी को धन्यवाद।

+0

क्या आपको कभी यह सॉर्ट किया गया था? यदि हां, तो मन साझा करना? –

उत्तर

7

क्योंकि उनके कार्यान्वयन getStringArray() का उपयोग करता है, तो आइकन को शामिल करने के लिए पंक्ति वस्तु के xml को संशोधित करने का कोई तरीका नहीं है।

एक ListAdapter के लिए मॉडल डेटा के चुनाव कि ListAdapter द्वारा बनाई गई पंक्तियों प्रतीक हो सकता है, इस पर कोई प्रभाव पड़ता है।

क्या कोई जानता है कि नेविगेशन ड्रॉवर आइटम में आइकन कैसे जोड़ें?

ListAdapter के लिए अपनी पंक्ति लेआउट में ImageView डालें। ImageView को अपने ListAdapter के माध्यम से पॉप्युलेट करें, जैसे पर getView() ओवरराइड करके। आईओओ, आप ऐसा करते हैं जैसा कि आप किसी अन्य ListView के लिए करते हैं, जैसा कि वर्षों से किया गया है।

वहाँ एक सरल API कॉल

कि "सरल" और "API कॉल" की अपनी परिभाषा पर निर्भर करता है के साथ ऐसा करने का कोई तरीका है।

3

स्ट्रिंग सरणी पंक्तियों का परिभाषित लेआउट नहीं है। आपका R.layout.drawer_list_item सूची की प्रत्येक पंक्ति के लेआउट का प्रतिनिधित्व करता है। यदि आप एक छवि (या यहां तक ​​कि अन्य जटिल पंक्ति लेआउट) शामिल करना चाहते हैं तो आप उस दृश्य लेआउट xml में छवि दृश्य को R.layout.drawer_list_item 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 पद्धति का उपयोग कर रहा है। उदाहरणों को आप देख सकते हैं कई स्थानों में से एक 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); 

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

के insted वास्तव में स्पष्ट रूप से मैं एक वस्तु उन्मुख कार्यान्वयन कि NavigationItem रों की एक सरणी से सब कुछ उत्पन्न करता है के लिए कोड की कुछ अतिरिक्त लाइनें किया इस संरचना करने के लिए - एक सादे जावा क्लास जिसमें मेनू आइटम के टेक्स्ट, आइकन और खंड के लिए फ़ील्ड शामिल हैं:

मुख्य गतिविधि में मेरा नेविगेशन बस परिभाषित किया गया है सरणी द्वारा:

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:

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; 
    } 
} 

जो एक बहुत ही बुनियादी XML लेआउट, list_item_navigation का उपयोग करता है, तो केवल एक ImageView और एक TextView

संबंधित मुद्दे