2013-07-28 19 views
7

के साथ मैं एक सारमेनैक्टिविटी चाहता हूं जो नेविगेशन ड्रॉवर बनाता है। वहां मुझे मेनू आइटम पर क्लिक को भी संभालना चाहिए और फिर नई गतिविधियां कॉल करना चाहिए। उन गतिविधियों में, मैं फिर से उसी नेविगेशन ड्रॉवर का उपयोग करना चाहता हूं।एंड्रॉइड नेविगेशन ड्रॉवर (कॉलिंग गतिविधियां) सारमेनमाइटीविटी

मैं सार तत्वों के साथ उप-वर्गों में विस्तारित करता हूं और प्रत्येक उपclass से getLayoutResourceID को अलग-अलग कॉल करता हूं (जैसा कि यहां बताया गया है: android how to create my own Activity and extend it?)।

समस्या यह है कि अब सार तत्वमात्रता में जहां मैं नेविगेशन ड्रॉवर बनाना चाहता हूं, मेरे पास नेविगेशन ड्रॉवर लेआउट (xml) तत्व तक कोई पहुंच नहीं है, क्योंकि मैं निश्चित रूप से एक अलग बेस लेआउट रखना चाहता हूं उपclasses।

क्या मुझे सभी सबक्लास लेआउट फ़ाइलों में "लेआउट शामिल करना" होगा? लेकिन यह काम नहीं करता है, अगर मैं नेविगेशन ड्रॉवर के साथ टुकड़ों की बजाय क्रियाकलापों का उपयोग करना चाहता हूं तो मैं क्या गलत करूं?

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

यह (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> 

यह नेविगेशन ड्रॉर (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"/> 

लेकिन यह काम नहीं करता है, लेकिन अगर मेरे पास यह नहीं है, तो मुझे शून्य-सूचक अपवाद मिलते हैं जब मेरा सबक्लास क्लास को अमूर्त कक्षा का निर्माण करता है, जहां मैं नेविगेशन ड्रॉवर बनाना चाहता हूं, इसे लेआउट-तत्व नहीं मिलते हैं सूचियां और लेआउट सेट करें (R.id.left_drawer या R.id.drawer_layout)!

+0

आपने क्या किया? मेरे पास एक ही सवाल है। – theblang

+0

@mattblang फ़ॉलो करें [यह] (http://naddydroid.blogspot.in/) लिंक। – Naddy

उत्तर

1

पिछले ऐप्स में मैंने जो किया है, उसके पास अमूर्त गतिविधि में फ़ंक्शन कॉल के रूप में बनाया गया एक स्लाइडिंग मेनू है। जब आप अमूर्त गतिविधि को विस्तारित करने वाली एक नई गतिविधि स्थापित करते हैं, तो आप ऑनक्रेट() में फ़ंक्शन कॉल करते हैं। मैं वर्तमान में नेविगेशन ड्रॉवर का उपयोग करके इसी तरह के कार्यान्वयन पर काम कर रहा हूं, इसलिए मुझे यकीन नहीं है कि यह अभी तक काम करता है, लेकिन यह आपके लिए शुरू करने के लिए एक अच्छी जगह हो सकती है। नेविगेशन ड्रॉवर को कॉल करने वाली आपकी सभी गतिविधियां शीर्ष-स्तर के लेआउट तत्व के रूप में ड्रॉवरलाउट की आवश्यकता होगी।

+0

धन्यवाद, तो मेरा दृष्टिकोण उप-गतिविधि लेआउट में दराज लेआउट सहित सही दिशा में जा रहा है? फिर मैं अनुमानित वर्ग वर्ग में नेविगेशन ड्रॉवर मेनू को सेट अप करने में सक्षम हूं, लेकिन किसी भी तरह "शामिल" अभी तक काम नहीं करता है। सबसे खराब मामले में मेरे पास लेआउट में कोड-डुप्लिकेशन है, लेकिन कम से कम गतिविधि कोड में नहीं। –

+0

दाएं। मैंने वास्तव में इसे अभी लागू किया है और यह काम करता है। प्रत्येक नए गतिविधि लेआउट में DrawerLayout शीर्ष-स्तर और शामिल ड्रॉवर तत्वों की आवश्यकता होगी। आपको दराज तत्वों को वही आईडी देना चाहिए जैसा उनके पास सारणी लेआउट में है ताकि आप दराज के लिए अमूर्त गतिविधि से प्राप्त फ़ंक्शन कॉल का पुन: उपयोग कर सकें। दुर्भाग्यवश, चूंकि एंड्रॉइड के लिए डिज़ाइन योजना कई क्रियाओं से कई गतिविधियों के साथ एक गतिविधि में दूर जा रही है, इसलिए मैं उन्हें जल्द ही किसी भी समय "शामिल" कार्यक्षमता जोड़ने को नहीं देखता। – supern00b

12

मैं यह भी पता लगाने की कोशिश कर रहा हूं कि यह कैसे करें।

मैंने एक बहुत अच्छा ट्यूटोरियल देखा है जो वास्तव में आप here चाहते हैं। विचार एक अमूर्त गतिविधि वर्ग AbstractNavDrawerActivity बनाना है कि दराज के साथ सभी गतिविधियां प्राप्त होंगी। यह वर्ग NavDrawerActivityConfiguration बीन क्लास का उपयोग करता है जिसमें एनवी ड्रॉवर के बारे में सारी जानकारी होती है जिसमें

एक और दृष्टिकोण NavDrawerUtil कक्षा बना रहा है जहां आप एनवी ड्रॉवर के साथ बातचीत करने वाली स्थिर विधियां डाल देंगे। फिर आपको इन तरीकों को प्रत्येक गतिविधि से कॉल करने की आवश्यकता होगी।

दूसरा दृष्टिकोण आपको अधिक लचीलापन देता है और आपको लेआउट inflations के आदेश के बारे में चिंता करने की ज़रूरत नहीं है और मुझे लगता है कि यह AbstractNavDrawerActivity के साथ पहले की तुलना में कम साफ समाधान है कि एनवी ड्रॉवर के साथ सभी गतिविधियां जैसे आपने सुझाव दिया

+0

http://stackoverflow.com/a/4922740/3060087 एक ही दृष्टिकोण का उपयोग करके एक आसान समाधान है। यह उदाहरण प्रत्येक गतिविधि में एक ही स्लाइडिंग ड्रॉवर को कार्यान्वित करने के लिए है, लेकिन इसे ड्रैवरलाइट द्वारा ड्रॉवर एक्टिविटी में लाइनरलाइट को प्रतिस्थापित करके नेविगेशन ड्रॉवर के लिए समायोजित किया जा सकता है। – Price

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