2016-03-18 10 views
8

मुझे क्या करना कोशिश कर रहा हूँ, इस तरह की एक NavigationDrawer मेनू है: NavigationDrawerएंड्रॉयड: NavigationDrawer/एकाधिक गतिविधियों/एक ही मेनू

मैं समझ गए होंगे लेआउट बदलने के लिए कैसे जब मेनू आइटम पर क्लिक किया जाता है, लेकिन कैसे क्या मैं मेनू खोए बिना एक नई गतिविधि लोड करता हूं?

मेरा मुख्य सवाल:

उदाहरण के लिए मेरे मेनू विकल्पों में से एक एक लेआउट जहां कुछ बटन कि कुछ करना नहीं है पर ले जाता है कहते हैं करते हैं। मुझे एक साथ गतिविधि/कक्षा लोड करने की आवश्यकता है, जो ऐप में उस विशिष्ट "पृष्ठ" की क्रियाओं और कार्यक्षमता को संभालेगा। यदि कोई अन्य मेनू विकल्प आपको केवल एक छवि के साथ लेआउट पर ले जाता है, उदाहरण के लिए, यह उस कोड के बिना एक और गतिविधि होगी जो बटन की कार्यक्षमता को संभालती है, क्योंकि इस स्क्रीन में कोई बटन नहीं है।

मुझे आशा है कि यह समझ में आता है! मैंने कई विधियों (टुकड़े इत्यादि) का उपयोग करके ऑनलाइन कई ट्यूटोरियल/वीडियो का पालन किया लेकिन कुछ भी मेरे प्रश्न का उत्तर नहीं दिया।

+0

वैसे, मैं अब क्या कर रहा हूं कि मेरे पास बेसएक्टिविटी है जो नेविगेशन ड्रावर को जगह में रखती है और मुख्य लेआउट लोड करती है। मुझे पता है कि मैं इस कोड को हर एक गतिविधि में दोहरा सकता हूं, लेकिन मैं कोड दोहराने से बचने की कोशिश कर रहा हूं। मैंने अपनी अन्य कक्षाओं को इस बेसएक्टिविटी का विस्तार करने की कोशिश की, लेकिन तब मुझे नहीं पता कि मेनू –

उत्तर

19

जो मैं समझता हूं, उससे आप प्रत्येक गतिविधि में नेविगेशन ड्रॉवर मौजूद होना चाहते हैं। दो विधियां हैं:

  1. @ रसेल के उत्तर का उपयोग करें। फ़्रेमलेआउट वाले मुख्य गतिविधि को आमतौर पर content_frame कहा जाता है जो संपूर्ण गतिविधि को कवर करता है। इस गतिविधि में नेविगेशन ड्रॉवर के लिए कोड है। बटन क्लिक पर आप वांछित टुकड़े के लेआउट के साथ इस लेआउट की सामग्री को प्रतिस्थापित कर सकते हैं (यानी कई बटनों के साथ खंड या छवि कहें)। तो दराज में तत्व सभी टुकड़े हैं। ट्यूटोरियल्स में fragFragmentManager() के माध्यम से टुकड़े बुलाए जाते हैं। इन लोगों द्वारा नेविगेशन ड्रॉवर पर वीडियो श्रृंखला देखें, slidenerd: https://www.youtube.com/watch?v=K8hSIP2ha-g। इसे लागू करने का प्रयास करें क्योंकि आप वीडियो

  2. पर व्यक्तिगत रूप से इस विधि को प्राथमिकता देते हैं लेकिन इसकी इसकी सीमाएं हैं। आधारभूतता बनाएं जिसमें नेविगेशन ड्रॉवर के लिए कोड है। इसमें एक framelayout आमतौर पर content_frame कहा जाता है जो पूरी गतिविधि को शामिल करता है। दराज करने की आवश्यकता वाले गतिविधियां एपकोम्पैक्टिविटी या गतिविधि की बजाय इस आधारभूतता को बढ़ाती हैं। लेआउट मुद्रास्फीति इस तरह काम करता है: getLayoutInflater().inflate(R.layout.activity_this, contentFrameLayout);setContentView के बजाय। यहां गतिविधियां startActivity के माध्यम से शुरू की गई हैं। इस विधि के विपक्ष: ए) बेसएक्टिविटी नष्ट हो जाती है और जब भी उपयोगकर्ता गतिविधि बदलता है तो उसे फिर से बनाया जाता है। बी) गतिविधि केवल एक वर्ग का विस्तार कर सकती है जो डिफ़ॉल्ट रूप से आधार बन जाती है सक्रियता पेशेवर: ए) आप एक गतिविधि स्टैक को बनाए रख सकते हैं b) प्रत्येक गतिविधि में इसका स्वयं का कॉन्फ़िगरेशन परिवर्तन नियम और ऑनसवेंस नियम हो सकते हैं।सी) इन गतिविधियों में अलग-अलग टुकड़े हो सकते हैं, जो संचार के लिए इस गतिविधि का उपयोग करते हैं। पहली विधि में ऐसा करने का प्रयास किया जा रहा अनावश्यक रूप से इंटरफेस की भारी संख्या को लागू मुख्य गतिविधि शामिल होगा ऊपर जवाब मैं वास्तव में क्या करना करने में सक्षम था करने के लिए

1

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

टुकड़ों का उपयोग करें, लेकिन अपने यूआई तत्वों को फ्रेमलेआउट (आईडी: content_frame) के बाहर गतिविधि लेआउट में जोड़ें, फिर जब आप मेनू आइटम पर क्लिक करते हैं, तो आपका खंड लेनदेन केवल सामग्री_फ्रेम फ्रेमलेआउट को प्रभावित करेगा, अन्य सभी लेआउट आइटम छोड़कर जगह में।

निश्चिंत रहें, साथी, यह केवल यहां से स्पष्ट हो जाता है ... जब तक आप अगले दीवार से टकरा: https://www.udacity.com/course/viewer#!/c-ud853/l-1395568821

और यह सामग्री:: http://developer.android.com/training/implementing-navigation/nav-drawer.html

डी

मैं इस ट्यूटोरियल का सुझाव

32

धन्यवाद (आप अंतर-टुकड़ा संचार में इंटरफेस बारे में सीखना होगा) मैं चाहता था, यहाँ है कि वास्तव में क्या मैं भविष्य में इस की तलाश में किसी के लिए भी किया था:

मेरे activity_main.xml इस तरह दिखता है:

<!--When the DrawerLayout is the root layout, the first child--> 
<!--of that layout is the contents of the main screen, and the--> 
<!--second child is the contents of the menu--> 

<!--First child layout--> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <include 
     layout="@layout/toolbar_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/content_frame"/> 

</LinearLayout> 

<!--Second child layout--> 
<android.support.design.widget.NavigationView 
    android:id="@+id/navigation_view" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="start" 
    app:headerLayout="@layout/navigation_drawer_header" 
    app:menu="@menu/drawer_menu"> 

</android.support.design.widget.NavigationView> 

यह मानक ड्रॉवरलाउट है जो नेविगेशन ड्रावर मेनू के लिए सभी बिट्स और टुकड़ों को एक साथ खींचता है। इसके लिए महत्वपूर्ण जोड़ फ्रेमलाउट है ... बिट जिस पर मैंने आईडी content_frame दिया था। यह वह जगह है जहां अन्य गतिविधियों द्वारा उपयोग किए जाने वाले सभी अन्य लेआउट को धक्का/जोड़ा/फुलाया जाएगा।

मेरे BaseActivity.java इस तरह दिखता है:

package com.example.test; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.design.widget.NavigationView; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.MenuItem; 

public class BaseActivity extends AppCompatActivity { 

    DrawerLayout drawerLayout; 
    ActionBarDrawerToggle actionBarDrawerToggle; 
    Toolbar toolbar; 

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

     NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_view); 

     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_closed); 
     drawerLayout.setDrawerListener(actionBarDrawerToggle); 

     navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 
      @Override 
      public boolean onNavigationItemSelected(MenuItem item) { 
       switch (item.getItemId()) { 

        case R.id.menu_home: 
         Intent anIntent = new Intent(getApplicationContext(), TheClassYouWantToLoad.class); 
         startActivity(loadPlayer); 
         drawerLayout.closeDrawers(); 
         break; 

       } 
       return false; 
      } 
     }); 

    } 

    @Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 

     actionBarDrawerToggle.syncState(); 
    } 

} 

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

Intent anIntent = new Intent(getApplicationContext(), TheClassYouWantToLoad.class); 
startActivity(anIntent); 
drawerLayout.closeDrawers(); 

आपको अपनी कक्षा के साथ "TheClassYouWantToLoad" को प्रतिस्थापित करने की आवश्यकता है।

public class TheClassYouWantToLoad extends BaseActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

super.onCreate(savedInstanceState); 

FrameLayout contentFrameLayout = (FrameLayout) findViewById(R.id.content_frame); //Remember this is the FrameLayout area within your activity_main.xml 
getLayoutInflater().inflate(R.layout.the_layout_you_want_to_load, contentFrameLayout); 
    } 
} 

और लेआउट आप लोड करना चाहते हैं के नाम के साथ "the_layout_you_want_to_load" की जगह: अब के भीतर इस नए वर्ग (जो संभवतः कुछ नए UI तत्व की आवश्यकता है लोड करने के लिए), आपको निम्न की जरूरत है।

+0

खोने के बिना एक नया लेआउट कैसे लोड करना है, आपको बहुत धन्यवाद! – Denny

+0

एक आकर्षण की तरह काम करता है और समझने में बहुत आसान है, धन्यवाद! –

+1

नेविगेशन के माध्यम से नेविगेटिंग हमेशा टैक्स के बैक स्टैक में जोड़ रहा है। मेमोरी बर्बाद करने और नेविगेशन को कम करने से बचने के लिए (यदि एक ही मुख्य गतिविधि पर नेविगेट किया जाता है तो यह अंतिम स्थिति को फिर से लोड करेगा) प्रत्येक पैरामीटर 'एंड्रॉइड: launchMode = "सिंगल टास्क" में अपने AndroidManifests.xml में जोड़ना अच्छा हो सकता है। यह हमेशा बढ़ते ढेर के लिए रोक देगा ... देखें: [एपीआई गाइड बैक स्टैक] (https://developer.android.com/guide/components/activities/tasks-and-back-stack.html#ManagingTasks) –

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