2013-06-12 41 views
17

Tôi đã tẩy trang web để tìm câu trả lời cho câu hỏi này nhưng dường như không thể tìm thấy câu trả lời, ngay cả trong tài liệu chính thức của Android.Thêm biểu tượng vào ngăn điều hướng Android?

Tôi đang trong quá trình tạo ứng dụng triển khai bố cục ngăn điều hướng mới của Android. Tài liệu về bố cục này có thể được tìm thấy herehere.

Trong tài liệu thiết kế cũng như trong một số ứng dụng phổ biến như Facebook và Google Dòng tin, các mục ngăn kéo có biểu tượng ở phía trước.

Các tài liệu thiết kế riêng của mình đề cập đến họ, trong "Nội dung của Navigation Drawer"

mục tiêu Navigation có thể có các biểu tượng hàng đầu không bắt buộc cũng như quầy trailing. Sử dụng bộ đếm để thông báo cho người dùng về trạng thái dữ liệu đã thay đổi trong chế độ xem tương ứng.

Thật không may, tài liệu dành cho nhà phát triển không đề cập đến cách triển khai biểu tượng trong thiết lập này. Nó mô tả làm thế nào để thực hiện danh sách các mục như vậy:

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

    ... 
} 
} 

Bởi vì việc thực hiện sử dụng getStringArray(), không có cách nào tôi có thể nghĩ ra để sửa đổi xml mục hàng để bao gồm một biểu tượng.

Điều này rất khó hiểu vì nhiều ứng dụng dường như triển khai các biểu tượng trước mỗi mục văn bản, và tài liệu Thiết kế thậm chí còn tham chiếu đến việc thêm biểu tượng. Tôi cảm thấy rằng phải có một số cuộc gọi API đơn giản để hoàn thành việc thêm các biểu tượng này, và thực hiện duy nhất tôi đã tìm thấy cho đến nay có vẻ phức tạp ridiculously.

Có ai biết cách thêm biểu tượng vào các mục ngăn điều hướng không? Có cách nào để làm điều này với một cuộc gọi API đơn giản, hoặc có tất cả các công ty này (Facebook, Google, vv) đã phải tìm cách để hack xung quanh vấn đề?

Cảm ơn mọi người.

+0

Bạn đã bao giờ nhận được sắp xếp này chưa? Nếu vậy, tâm trí chia sẻ? –

Trả lời

7

Do triển khai của chúng sử dụng getStringArray(), không có cách nào tôi có thể nghĩ để sửa đổi xml của mục hàng để bao gồm biểu tượng.

Việc chọn dữ liệu mẫu cho ListAdapter không ảnh hưởng đến việc các hàng được tạo bởi ListAdapter có thể có biểu tượng hay không.

Có ai biết cách thêm biểu tượng vào các mục ngăn điều hướng không?

Đặt ImageView trong bố cục hàng của bạn cho ListAdapter. Điền vào số đó ImageView qua số ListAdapter của bạn, chẳng hạn như bằng cách ghi đè getView() trên số ArrayAdapter của bạn. IOW, bạn làm điều đó giống như cách bạn làm cho bất kỳ ListView nào khác, như đã được thực hiện trong nhiều năm.

Có cách nào để làm điều này với một cuộc gọi API đơn giản

đó phụ thuộc vào định nghĩa lại "đơn giản" và "gọi API".

3

Mảng chuỗi không phải là bố cục xác định của các hàng. R.layout.drawer_list_item của bạn đại diện cho bố cục của mỗi hàng trong danh sách. Nếu bạn muốn bao gồm một hình ảnh (hoặc thậm chí bố trí hàng phức tạp khác), bạn sẽ bao gồm khung nhìn hình ảnh vào bố cục tùy chỉnh đó xml thay thế R.layout.drawer_list_item xml.

Để biết cách đặt hình ảnh hoặc văn bản thành mỗi hàng khác nhau, điều này được thực hiện theo phương pháp getView() của bộ điều hợp mảng. Một ví dụ thô giống như thế này (giả sử có một lượt xem văn bản và số lần xem trước trong hàng):

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

Cách hiệu quả hơn để thực hiện chế độ xem cho mỗi hàng là sử dụng mẫu trình xem. Một trong nhiều nơi bạn có thể tìm thấy ví dụ là here.

6

Tạo một lớp Adaptor như ..

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; 

} 

} 

Và tạo ra một số thay đổi của MainActivity của bạn.

sử dụng

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

    mDrawerList.setAdapter(adClass); 

insted của

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

Để cấu trúc này thực sự rõ ràng tôi đã làm một vài dòng thêm mã cho một thực hiện theo định hướng đối tượng mà tạo ra tất cả mọi thứ từ một mảng của NavigationItem s - một lớp Java đơn giản có chứa các trường cho văn bản, biểu tượng và đoạn của một mục menu:

Trong MainActivity, Điều hướng của tôi được định nghĩa đơn giản bởi mảng:

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

Các NavigationItem lớp:

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

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

trong đó sử dụng một bố cục xml rất cơ bản, list_item_navigation, mà chỉ chứa một ImageView và một TextView.

Các vấn đề liên quan