2013-07-28 45 views
7

Tôi muốn có AbstractMainActivity tạo Ngăn điều hướng. Trong đó tôi cũng nên xử lý các nhấp chuột vào các mục trình đơn và sau đó gọi các hoạt động mới. Trong những hoạt động đó, tôi muốn sử dụng lại cùng một ngăn điều hướng.Ngăn điều hướng Android (hoạt động gọi điện) với AbstractMainActivity

Tôi sẽ mở rộng trong các lớp con bằng AbstractMainActivity và gọi hàm getLayoutResourceID khác với từng lớp con (như được đề xuất ở đây: android how to create my own Activity and extend it?).

Vấn đề là, bây giờ trong AbstractMainActivity nơi tôi muốn xây dựng ngăn điều hướng, tôi không có quyền truy cập vào phần tử bố trí ngăn điều hướng (xml), vì dĩ nhiên tôi muốn có bố cục cơ sở khác nhau cho các lớp con.

Tôi có cần phải "bao gồm bố cục" trong tất cả các tệp bố cục lớp con không? Nhưng điều này không hiệu quả, tôi phải làm gì sai nếu tôi muốn sử dụng Hoạt động thay vì Phân đoạn bằng Ngăn điều hướng?

public abstract class MainActivity extends Activity { 

private String[] menuItems; 
private DrawerLayout mDrawerLayout; 
private ListView mDrawerList; 

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

    setContentView(getLayoutResourceId()); 

    menuItems = getResources().getStringArray(R.array.menu_items); 
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mDrawerList = (ListView) findViewById(R.id.left_drawer); 

    // Set the adapter for the list view 
    mDrawerList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, menuItems)); 
    // Set the list's click listener 
    mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

} 


protected abstract int getLayoutResourceId(); 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 


private class DrawerItemClickListener implements ListView.OnItemClickListener { 
    @Override 
    public void onItemClick(AdapterView parent, View view, int position, long id) { 
     selectItem(position); 
    } 

    /** Swaps fragments in the main content view */ 
    private void selectItem(int position) { 
     //Fragment fragment = new PlanetFragment(); 
     Bundle args = new Bundle(); 
     // args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position); 

     Intent intent = new Intent(MainActivity.this, ProductListActivity.class); 
     startActivity(intent); 

    } 
} 




public class ProductListActivity extends MainActivity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.options_menu, menu); 
    return true; 
} 

@Override 
protected int getLayoutResourceId() { 
    // TODO Auto-generated method stub 
    return R.layout.activity_product_list; 
} 

Đây là cách bố trí của các danh sách sản phẩm sub-class (activity_product_list.xml):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context=".ProductList" > 

<include layout="@layout/activity_main"/> 

<ListView 
    android:id="@+id/listView1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:layout_centerVertical="true" > 
</ListView> 

Đây là cách bố trí của ngăn điều hướng (activity_main.xml):

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:android1="http://schemas.android.com/apk/res/android" 
android:id="@+id/drawer_layout" 
android:layout_width="300dp" 
android:layout_height="500dp" > 

<!-- The main content view --> 
<FrameLayout 
    android:id="@+id/content_frame" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 
<!-- The navigation drawer --> 
<ListView android:id="@+id/left_drawer" 
    android:layout_width="240dp" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:choiceMode="singleChoice" 
    android:divider="@android:color/transparent" 
    android:dividerHeight="0dp" 
    android:background="#c3c3c3"/> 

Nhưng không hoạt động, nhưng nếu tôi không có nó, tôi nhận được ngoại lệ con trỏ null khi lớp con của tôi gọi onCreate của lớp trừu tượng, nơi tôi muốn xây dựng Ngăn Điều hướng, nó không tìm thấy các thành phần layout thiết lập danh sách và bố cục (R.id.left_drawer hoặc R.id.drawer_layout)!

+0

Bạn đã làm gì? Tôi có cùng một câu hỏi. – theblang

+0

@mattblang Theo dõi liên kết [this] (http://naddydroid.blogspot.in/). – Naddy

Trả lời

1

Những gì tôi đã làm trong các ứng dụng trước đó là có một menu trượt được xây dựng như một cuộc gọi hàm trong hoạt động trừu tượng. Khi bạn thiết lập một Hoạt động mới mở rộng hoạt động trừu tượng, bạn thực hiện lệnh gọi hàm trong phương thức onCreate(). Tôi hiện đang làm việc trên một thực hiện tương tự bằng cách sử dụng Navigation Drawer thay vào đó, vì vậy tôi không hoàn toàn chắc chắn nếu nó hoạt động được nêu ra, nhưng nó có thể là một nơi tốt để bạn có thể bắt đầu. Tất cả các Hoạt động của bạn sẽ gọi Ngăn điều hướng sẽ cần phải có DrawerLayout làm phần tử bố cục cấp cao nhất.

+0

Cảm ơn, vì vậy cách tiếp cận của tôi đang đi đúng hướng với việc bố trí ngăn kéo trong bố cục hoạt động phụ? Sau đó, tôi sẽ có thể thiết lập menu ngăn kéo điều hướng trong lớp trừu tượng tôi đoán, nhưng bằng cách nào đó "bao gồm" chưa hoạt động. Trường hợp xấu nhất tôi có mã trùng lặp trong bố trí, nhưng ít nhất không có trong mã hoạt động. –

+0

Phải. Tôi đã thực sự chỉ thực hiện điều này và nó hoạt động. Mỗi bố cục hoạt động mới sẽ cần có cấp cao nhất DrawerLayout và các phần tử ngăn kéo được bao gồm. Bạn nên cung cấp cho các phần tử ngăn chứa cùng một id như chúng có trong bố cục trừu tượng để bạn có thể tái sử dụng cuộc gọi hàm được kế thừa từ hoạt động trừu tượng cho ngăn kéo. Thật không may, vì kế hoạch thiết kế cho Android dường như đang chuyển từ nhiều Hoạt động sang một Hoạt động với nhiều đoạn, tôi không thấy họ thêm chức năng "bao gồm" vào bất kỳ thời điểm nào sớm. – supern00b

12

Tôi cũng đang cố gắng tìm ra cách thực hiện việc này.

Tôi đã xem một hướng dẫn rất hay thực hiện chính xác những gì bạn muốn here. Ý tưởng là tạo một lớp hoạt động trừu tượng AbstractNavDrawerActivity rằng tất cả các hoạt động với ngăn kéo sẽ được kế thừa từ đó. Lớp này sử dụng lớp bean NavDrawerActivityConfiguration chứa tất cả thông tin về ngăn điều hướng bao gồm bố cục cần được tăng thêm

Một cách tiếp cận khác sẽ tạo ra một phương thức tĩnh tương tác với ngăn điều hướng. Sau đó bạn sẽ gọi những phương thức này từ mỗi hoạt động khi bạn cần. Cách tiếp cận thứ hai mang lại cho bạn sự linh hoạt hơn và bạn không phải lo lắng về thứ tự của bố cục và như vậy, nhưng tôi nghĩ rằng nó là giải pháp ít sạch hơn giải pháp đầu tiên với AbstractNavDrawerActivity rằng tất cả các hoạt động với ngăn điều hướng kế thừa từ bạn đã đề xuất.

+0

http://stackoverflow.com/a/4922740/3060087 là giải pháp đơn giản hơn bằng cách sử dụng cùng một cách tiếp cận. Ví dụ này là để thực hiện cùng một ngăn kéo trượt trong mỗi Activity, nhưng nó có thể được điều chỉnh cho ngăn điều hướng bằng cách thay thế LinearLayout trong DrawerActivity bằng DrawerLayout. – Price