विभिन्न गतिविधियों में एक ही नेविगेशन दराज


206

मैंने एक कामकाजी नैविगेशन ड्रॉअर बनाया जैसे कि इसे developer.android.com वेबसाइट पर ट्यूटोरियल में दिखाया गया है । लेकिन अब, मैं अपने अनुप्रयोग में कई गतिविधियों के लिए NavigationDrawer.class में बनाए गए एक नेविगेशन ड्रावर का उपयोग करना चाहता हूं।

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

मैंने कई गतिविधियों पर इस उत्तर Android नेविगेशन दराज में इसे पहले पढ़ा

लेकिन यह मेरी परियोजना पर काम नहीं किया

public class NavigationDrawer extends Activity {
public DrawerLayout drawerLayout;
public ListView drawerList;
private ActionBarDrawerToggle drawerToggle;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawerToggle = new ActionBarDrawerToggle((Activity) this, drawerLayout, R.drawable.ic_drawer, 0, 0) {

        public void onDrawerClosed(View view) {
            getActionBar().setTitle(R.string.app_name);
        }

        public void onDrawerOpened(View drawerView) {
            getActionBar().setTitle(R.string.menu);
        }
    };
    drawerLayout.setDrawerListener(drawerToggle);

    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);

    layers = getResources().getStringArray(R.array.layers_array);
    drawerList = (ListView) findViewById(R.id.left_drawer);
    View header = getLayoutInflater().inflate(R.layout.drawer_list_header, null);
    drawerList.addHeaderView(header, null, false);
    drawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, android.R.id.text1,
            layers));
    View footerView = ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
            R.layout.drawer_list_footer, null, false);
    drawerList.addFooterView(footerView);

    drawerList.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
            map.drawerClickEvent(pos);
        }
    });
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    if (drawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    return super.onOptionsItemSelected(item);

}

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

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    drawerToggle.onConfigurationChanged(newConfig);
}
}

इस गतिविधि में मैं नेविगेशन ड्रावर रखना चाहता हूं, इसलिए मैं 'नेवीगेशनड्रैवर' का विस्तार करता हूं और कुछ अन्य गतिविधियों में मैं उसी नेविगेशन ड्रावर को यूजर करना चाहता हूं।

  public class SampleActivity extends NavigationDrawer {...}

मुझे नहीं पता कि क्या बदलना है ...


1
आप यहां उदाहरण देख सकते हैं ।
नड्डी

1
आप यहां से पा सकते हैं: stackoverflow.com/questions/33009469/…
varotariya vajsi

जवाबों:


188

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

http://developer.android.com/training/implementing-navigation/nav-drawer.html

आप इस ट्यूटोरियल से नमूना कोड भी डाउनलोड कर सकते हैं, यह देखने के लिए कि आप यह कैसे कर सकते हैं।


टुकड़े के बिना:

यह आपका आधार कोड है:

public class BaseActivity extends Activity
{
    public DrawerLayout drawerLayout;
    public ListView drawerList;
    public String[] layers;
    private ActionBarDrawerToggle drawerToggle;
    private Map map;

    protected void onCreate(Bundle savedInstanceState)
    {
        // R.id.drawer_layout should be in every activity with exactly the same id.
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

        drawerToggle = new ActionBarDrawerToggle((Activity) this, drawerLayout, R.drawable.ic_drawer, 0, 0) 
        {
            public void onDrawerClosed(View view) 
            {
                getActionBar().setTitle(R.string.app_name);
            }

            public void onDrawerOpened(View drawerView) 
            {
                getActionBar().setTitle(R.string.menu);
            }
        };
        drawerLayout.setDrawerListener(drawerToggle);

        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        layers = getResources().getStringArray(R.array.layers_array);
        drawerList = (ListView) findViewById(R.id.left_drawer);
        View header = getLayoutInflater().inflate(R.layout.drawer_list_header, null);
        drawerList.addHeaderView(header, null, false);
        drawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, android.R.id.text1,
                layers));
        View footerView = ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
                R.layout.drawer_list_footer, null, false);
        drawerList.addFooterView(footerView);

        drawerList.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
                map.drawerClickEvent(pos);
            }
        });
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        if (drawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        return super.onOptionsItemSelected(item);

    }

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

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        drawerToggle.onConfigurationChanged(newConfig);
    }
}

अन्य सभी गतिविधियाँ जिनके लिए एक नेविगेशन ड्रावर की आवश्यकता है, इस गतिविधि को गतिविधि के बजाय स्वयं ही विस्तारित करना चाहिए, उदाहरण:

public class AnyActivity extends BaseActivity
{
    //Because this activity extends BaseActivity it automatically has the navigation drawer
    //You can just write your normal Activity code and you don't need to add anything for the navigation drawer
}

एक्सएमएल

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- The main content view -->
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <!-- Put what you want as your normal screen in here, you can also choose for a linear layout or any other layout, whatever you prefer -->
    </FrameLayout>
    <!-- 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="#111"/>
</android.support.v4.widget.DrawerLayout>

संपादित करें:

मैंने स्वयं कुछ कठिनाइयों का अनुभव किया, इसलिए यहाँ एक समाधान है यदि आप NullPointerException प्राप्त करते हैं। BaseActivity में ऑनक्रिएट फ़ंक्शन को बदल दें protected void onCreateDrawer()। बाकी वही रह सकता है। बेसएक्टिविटी को बढ़ाने वाली गतिविधियों में इस क्रम में कोड डालते हैं:

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);
    super.onCreateDrawer();

इससे मुझे अपनी समस्या को ठीक करने में मदद मिली, आशा है कि यह मदद करेगा!

यह है कि आप कई गतिविधियों के साथ एक नेविगेशन ड्रॉअर कैसे बना सकते हैं, यदि आपके पास कोई प्रश्न पूछने के लिए स्वतंत्र है।


2 संपादित करें:

जैसा कि @GregDan ने कहा है कि आपका BaseActivityओवरराइड भी कर सकता है setContentView()और वहां कॉल करें।

@Override 
public void setContentView(@LayoutRes int layoutResID) 
{ 
    super.setContentView(layoutResID); 
    onCreateDrawer() ;
}

7
मैं टुकड़ों पर गतिविधियों का उपयोग नहीं करना चाहता, मैं सिर्फ विभिन्न गतिविधियों का उपयोग करना चाहता हूं जो सभी समान नेविगेशन दराज का उपयोग करता है। मुझे गतिविधि चाहिए, क्योंकि मैं विभिन्न प्रकार के लेआउट का उपयोग कर सकता हूं जैसे कि स्वाइप व्यू, मैप व्यू ...
MEX

135
किसी भी काफी जटिल ऐप के लिए सिर्फ एक एक्टिविटी होना एक चुनौतीपूर्ण काम हो सकता है। गतिविधियों का उपयोग करना आपको सिस्टम से बहुत सारी मुफ्त चीजें देता है - इसलिए यह एक वैध बिंदु है कि एकाधिक गतिविधियों का उपयोग कैसे किया जाए। मैं किसी भी संख्या के टुकड़े संयोजनों के बीच संचार को संभालने वाली एक गतिविधि की कल्पना नहीं कर सकता - यह सिर्फ काम नहीं करने वाला है।
slott

1
मुझे खेद है कि मुझे जवाब देने में इतना समय लगा। मैंने अपना उत्तर संपादित किया। मेरा मानना ​​है कि यह वह ट्यूटोरियल है जिसकी आप तलाश कर रहे थे। उम्मीद है की यह मदद करेगा।
केविन वैन मिर्लो

2
@KevinvanMierlo आप मुझे बता सकते हैं कि आपका क्या मतलब है: R.id.drawer_layout हर गतिविधि में एक ही आईडी के साथ होना चाहिए। क्योंकि मैंने ठीक वही किया जो आपने यहाँ बताया था और मुझे NullPointerException onCreate () गतिविधि का तरीका मिलता है जो इस बेस एक्टिविटी को बढ़ाता है ..
Loolooii

1
@KevinvanMierlo btw, मुझे लगता है कि आप इन 2 लाइनों को भूल गए? super.onCreate (savedInstanceState); setContentView (R.layout.activity_base);
लूलूई

34

मुझे सबसे अच्छा कार्यान्वयन मिला है। यह Google I / O 2014 ऐप में है।

वे केविन के रूप में एक ही दृष्टिकोण का उपयोग करते हैं। यदि आप I / O ऐप के सभी अनावश्यक सामानों से खुद को अलग कर सकते हैं, तो आप अपनी ज़रूरत की हर चीज़ निकाल सकते हैं और Google द्वारा यह आश्वासन दिया जाता है कि यह नेविगेशन ड्रावर पैटर्न का सही उपयोग है। वैकल्पिक DrawerLayoutरूप से प्रत्येक गतिविधि का एक मुख्य लेआउट होता है। दिलचस्प हिस्सा यह है कि अन्य स्क्रीन पर नेविगेशन कैसे किया जाता है। इसे BaseActivityइस तरह से लागू किया जाता है :

private void goToNavDrawerItem(int item) {
        Intent intent;
        switch (item) {
            case NAVDRAWER_ITEM_MY_SCHEDULE:
                intent = new Intent(this, MyScheduleActivity.class);
                startActivity(intent);
                finish();
                break;

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


यह ^ मैं यह पता नहीं लगा सकता कि वे नई गतिविधियाँ कैसे शुरू करते हैं और यह त्रुटिपूर्ण काम करता है। यह काम करने के लिए एक बड़ा ऐप है।
hitch.united

@ hitch.united यह इसलिए है क्योंकि वे बहुत सारे अंशों और बस कुछ गतिविधियों का उपयोग करते हैं।
जोकिन इराचुक

@ hitch.united वे शायद गतिविधि के एनीमेशन को ओवरराइड करते हैं overridePendingTransitions
एपिकपांडाफायर

उपवर्ग गतिविधियों के बजाय लोड हो रहा है टुकड़े?
विकास पांडे

यहां अक्टूबर 2014 से फ़ाइल है: github.com/google/iosched/blob/…
denvercoder9

8

तो यह जवाब कुछ साल देर से है लेकिन कोई इसकी सराहना कर सकता है। एंड्रॉइड ने हमें एक नया विजेट दिया है जो कई गतिविधियों के साथ एक नेविगेशन दराज का उपयोग करना आसान बनाता है।

android.support.design.widget.NavigationView मॉड्यूलर है और मेनू फ़ोल्डर में इसका अपना लेआउट है। जिस तरह से आप इसका उपयोग करते हैं वह xml लेआउट को निम्नलिखित तरीके से लपेटना है:

  1. रूट लेआउट एक android.support.v4.widget.DrawerLayout है जिसमें दो बच्चे शामिल हैं: <include ... />उस लेआउट के लिए जिसे लपेटा जा रहा है (2 देखें) और एक android.support.design.widget.NavigationView।

    <android.support.v4.widget.DrawerLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        tools:openDrawer="start">
    
    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    
    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />
    

nav_header_main आपके नेविगेशन ड्रॉअर के हेडर के लिए ओरिएंटेशन = वर्टिकल के साथ सिर्फ एक लिनियर लयआउट है।

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

  1. एप्लिकेशन बार लेआउट आमतौर पर अब एक android.support.design.widget.CoordinatorLayout है और यह दो बच्चे शामिल होंगे: एक android.support.design.widget.AppBarLayout (जो एक android.support.v7.widget.Toolbar शामिल हैं) और एक <include ... >के लिए आपकी वास्तविक सामग्री (देखें 3)।

    <android.support.design.widget.CoordinatorLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="yourpackage.MainActivity">
    
     <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">
    
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />
    
    </android.support.design.widget.AppBarLayout>
    
    <include layout="@layout/content_main" />
    

  2. सामग्री लेआउट जो भी आप चाहते हैं लेआउट हो सकता है। यह वह लेआउट है जिसमें गतिविधि की मुख्य सामग्री होती है (नेविगेशन ड्रावर या ऐप बार सहित नहीं)।

अब, इस सब के बारे में अच्छी बात यह है कि आप इन दो लेआउट में प्रत्येक गतिविधि को लपेट सकते हैं, लेकिन आपके नेवीगेशन व्यू (चरण 1 देखें) हमेशा activity_main_drawer (या जो भी) को इंगित करें। इसका मतलब है कि आपके पास सभी गतिविधियों पर समान (*) नेविगेशन ड्रॉअर होगा।

  • वे नेविगेशनव्यू के समान उदाहरण नहीं होंगे , लेकिन, निष्पक्ष होने के लिए, ऊपर उल्लिखित बेसएक्टिविटी समाधान के साथ भी यह संभव नहीं था।

स्टैकओवरफ़्लो एक्सक्लूसिव xml ब्रैकेट्स में से कुछ को काट रहा है, लेकिन महत्वपूर्ण सामान वहाँ है।
jwehrle

लेकिन आप बटन जैसी कार्यक्षमता का इलाज कैसे करते हैं? आपको प्रत्येक गतिविधि में समान कोड लिखना होगा?
लॉरॉ

हां, क्योंकि ये अलग-अलग उदाहरण हैं। हालाँकि, आप अपनी गतिविधियों को बढ़ाने और उस कोड को एक बार वहां डालने के लिए एक सुपर क्लास बना सकते हैं।
jwehrle

@jwehrle क्या आप हमारी गतिविधियों के लिए एक सुपर क्लास बनाने के बारे में एक उदाहरण लिख सकते हैं?
सीडीरोस

सार्वजनिक अमूर्त वर्ग MyBaseActivity AppCompatActivity औजार फैली NavigationView.OnNavigationItemSelectedListener {// निम्नलिखित लागू: (@NonNull MenuItem आइटम) onNavigationItemSelected बूलियन अवहेलना सार्वजनिक {}} सार्वजनिक वर्ग MyActivity फैली MyBaseActivity {}
jwehrle

7

गतिविधियों के एक समूह के बीच एक सामान्य नेविगेशन दराज का पुन: उपयोग करने का सबसे आसान तरीका

app_base_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

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

    </FrameLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_view"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:menu="@menu/menu_test"
        />
</android.support.v4.widget.DrawerLayout>

AppBaseActivity.java

/*
* This is a simple and easy approach to reuse the same 
* navigation drawer on your other activities. Just create
* a base layout that conains a DrawerLayout, the 
* navigation drawer and a FrameLayout to hold your
* content view. All you have to do is to extend your 
* activities from this class to set that navigation 
* drawer. Happy hacking :)
* P.S: You don't need to declare this Activity in the 
* AndroidManifest.xml. This is just a base class.
*/
import android.content.Intent;
import android.content.res.Configuration;
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.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

public abstract class AppBaseActivity extends AppCompatActivity implements MenuItem.OnMenuItemClickListener {
    private FrameLayout view_stub; //This is the framelayout to keep your content view
    private NavigationView navigation_view; // The new navigation view from Android Design Library. Can inflate menu resources. Easy
    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mDrawerToggle;
    private Menu drawerMenu;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.app_base_layout);// The base layout that contains your navigation drawer.
        view_stub = (FrameLayout) findViewById(R.id.view_stub);
        navigation_view = (NavigationView) findViewById(R.id.navigation_view);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 0, 0);
        mDrawerLayout.setDrawerListener(mDrawerToggle);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        drawerMenu = navigation_view.getMenu();
        for(int i = 0; i < drawerMenu.size(); i++) {
          drawerMenu.getItem(i).setOnMenuItemClickListener(this);
        }
        // and so on...
    }

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

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

    /* Override all setContentView methods to put the content view to the FrameLayout view_stub
     * so that, we can make other activity implementations looks like normal activity subclasses.
     */
    @Override
    public void setContentView(int layoutResID) {
        if (view_stub != null) {
            LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
            ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT);
            View stubView = inflater.inflate(layoutResID, view_stub, false);
            view_stub.addView(stubView, lp);
        }
    }

    @Override
    public void setContentView(View view) {
        if (view_stub != null) {
            ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT);
            view_stub.addView(view, lp);
        }
    }

    @Override
    public void setContentView(View view, ViewGroup.LayoutParams params) {
        if (view_stub != null) {
            view_stub.addView(view, params);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Pass the event to ActionBarDrawerToggle, if it returns
        // true, then it has handled the app icon touch event
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        // Handle your other action bar items...

        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onMenuItemClick(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.item1:
                // handle it
                break;
            case R.id.item2:
                // do whatever
                break;
            // and so on...
        }
        return false;
    }
}

क्या आप ऐसी गतिविधि का उदाहरण प्रदान कर सकते हैं जो इस आधार गतिविधि का उपयोग करती है?
सीडीरोस

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

6

मूल पोस्टर जो पूछ रहा है, उसे करने के लिए किसी और के लिए, कृपया केविन के कहने के बजाय टुकड़ों का उपयोग करने पर विचार करें। यहाँ कैसे करना है पर एक उत्कृष्ट ट्यूटोरियल है:

https://github.com/codepath/android_guides/wiki/Fragment-Navigation-Drawer

यदि आप इसके बजाय उन गतिविधियों का उपयोग करना चुनते हैं, जो आपके द्वारा किसी नई गतिविधि में नेविगेट किए जाने के दौरान हर बार फिर से बनाए जाने वाले नाविक की समस्या में चलने वाली हैं। इसका परिणाम यह है कि हर बार नाविकों की बदसूरत / धीमी गति से प्रस्तुति होती है।


5

मेरा सुझाव है: गतिविधियों का उपयोग बिल्कुल न करें, इसके बजाय टुकड़ों का उपयोग करें, और उन्हें कंटेनर में बदलें (उदाहरण के लिए रैखिक लेआउट) जहां आप अपना पहला टुकड़ा दिखाते हैं।

कोड Android डेवलपर ट्यूटोरियल्स में उपलब्ध है, आपको बस कस्टमाइज़ करना है।

http://developer.android.com/training/implementing-navigation/nav-drawer.html

यह सलाह दी जाती है कि आपको अपने आवेदन में अधिक से अधिक अंशों का उपयोग करना चाहिए, और आपके आवेदन के लिए केवल चार बुनियादी गतिविधियां होनी चाहिए, जिनका आप बाहरी लोगों से अलग अपने AndroidManifest.xml में उल्लेख करते हैं (उदाहरण के लिए FacebookActivity):

  1. SplashActivity: कोई टुकड़े का उपयोग नहीं करता है, और फुलस्क्रीन थीम का उपयोग करता है।

  2. LoginSignUpActivity: बिल्कुल भी नेविगेशनड्रावर की आवश्यकता नहीं है, और साथ ही कोई बैक बटन नहीं है, इसलिए बस सामान्य टूलबार का उपयोग करें, लेकिन कम से कम, 3 या 4 टुकड़ों की आवश्यकता होगी। नो-एक्शन-बार थीम का उपयोग करता है

  3. होमएक्टिविटी या डैशबोर्ड गतिविधि: नो-एक्शन-बार थीम का उपयोग करता है। यहां आपको नेविगेशन दराज की आवश्यकता है, साथ ही सभी स्क्रीन जो फॉलो करने वाले हैं, वे साझा किए गए दराज के साथ लीफ व्यू तक टुकड़े या नेस्टेड टुकड़े होंगे। इस गतिविधि में सभी सेटिंग्स, उपयोगकर्ता प्रोफ़ाइल और आदि टुकड़े के रूप में यहां होंगे। यहां के टुकड़े बैक स्टैक में नहीं जोड़े जाएंगे और ड्रावर मेनू आइटम से खोले जाएंगे। टुकड़े के बजाय बैक बटन की आवश्यकता वाले टुकड़ों के मामले में, नीचे एक चौथी तरह की गतिविधि है।

  4. बिना दराज की गतिविधि। इस गतिविधि में शीर्ष पर एक बैक बटन है और अंदर के टुकड़े एक ही एक्शन-बार साझा करेंगे। इन टुकड़ों को बैक-स्टैक में जोड़ा जाएगा, क्योंकि इसमें नेविगेशन इतिहास होगा।

[आगे मार्गदर्शन के लिए देखें: https://stackoverflow.com/a/51100507/787399 ]

हैप्पी कोडिंग !!


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

@ Cabuxa.Mapache कृपया आगे की सहायता प्राप्त करने के लिए मेरे जवाब के लिए संलग्न लिंक की जाँच करें। मैंने एक सामान्य बेसऐक्टीविटी ली है, जो एक्शनबार टूलबार और नवगैटनड्रावर और अन्य घटकों को इससे जुड़े सभी अंशों को साझा करने में मदद करती है।
अभिनव सक्सेना

1

इस कोड को बेसिसिटी में अपडेट करें। और अपनी गतिविधि xml में drawer_list_header को शामिल करना न भूलें।

super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
setContentView(R.layout.drawer_list_header);

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


1

@ केविन वैन मिर्लो के उत्तर के साथ, आप कई ड्राअर को लागू करने में भी सक्षम हैं। उदाहरण के लिए, बाईं ओर स्थित डिफ़ॉल्ट मेनू (प्रारंभ), और दाईं ओर स्थित एक और वैकल्पिक मेनू, जो केवल तब दिखाया जाता है जब निर्धारण टुकड़े लोड किए जाते हैं।

मैं ऐसा करने में सक्षम रहा हूं।


1
package xxxxxx;



import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.widget.SearchView;
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.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;


public class loginhome extends AppCompatActivity {
    private Toolbar toolbar;
    private NavigationView navigationView;
    private DrawerLayout drawerLayout;

    // Make sure to be using android.support.v7.app.ActionBarDrawerToggle version.
    // The android.support.v4.app.ActionBarDrawerToggle has been deprecated.
    private ActionBarDrawerToggle drawerToggle;

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

        // Initializing Toolbar and setting it as the actionbar
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);


        //Initializing NavigationView


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

        //Setting Navigation View Item Selected Listener to handle the item click of the navigation menu
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {

            // This method will trigger on item Click of navigation menu

            public boolean onNavigationItemSelected(MenuItem menuItem) {


                //Checking if the item is in checked state or not, if not make it in checked state
                if(menuItem.isChecked()) menuItem.setChecked(false);
                else menuItem.setChecked(true);

                //Closing drawer on item click
                drawerLayout.closeDrawers();

                //Check to see which item was being clicked and perform appropriate action
                switch (menuItem.getItemId()){


                    //Replacing the main content with ContentFragment Which is our Inbox View;
                    case R.id.nav_first_fragment:
                        Toast.makeText(getApplicationContext(),"First fragment",Toast.LENGTH_SHORT).show();
                         FirstFragment fragment = new FirstFragment();
                        android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                        fragmentTransaction.replace(R.id.frame,fragment);
                        fragmentTransaction.commit();
                        return true;

                    // For rest of the options we just show a toast on click
                    case R.id.nav_second_fragment:
                        Toast.makeText(getApplicationContext(),"Second fragment",Toast.LENGTH_SHORT).show();
                        SecondFragment fragment2 = new SecondFragment();
                        android.support.v4.app.FragmentTransaction fragmentTransaction2 = getSupportFragmentManager().beginTransaction();
                        fragmentTransaction2.replace(R.id.frame,fragment2);
                        fragmentTransaction2.commit();
                        return true;

                    default:
                        Toast.makeText(getApplicationContext(),"Somethings Wrong",Toast.LENGTH_SHORT).show();
                        return true;

                }
            }
        });

        // Initializing Drawer Layout and ActionBarToggle
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.drawer_open, R.string.drawer_close){

            @Override
            public void onDrawerClosed(View drawerView) {
                // Code here will be triggered once the drawer closes as we dont want anything to happen so we leave this blank
                super.onDrawerClosed(drawerView);
            }

            @Override
            public void onDrawerOpened(View drawerView) {
                // Code here will be triggered once the drawer open as we dont want anything to happen so we leave this blank

                super.onDrawerOpened(drawerView);
            }
        };

        //Setting the actionbarToggle to drawer layout
        drawerLayout.setDrawerListener(actionBarDrawerToggle);

        //calling sync state is necessay or else your hamburger icon wont show up
        actionBarDrawerToggle.syncState();







    }

अपने टूलबार के लिए इसका उपयोग करें। xml

<?xml version="1.0" encoding="utf-8"?>

    <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        android:elevation="4dp"
        android:id="@+id/toolbar"
        android:theme="@style/ThemeOverlay.AppCompat.Dark"


        >

    </android.support.v7.widget.Toolbar>

यदि आप उपयोग करना चाहते हैं तो नेविगेशन हेडर के लिए इसका उपयोग करें

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="192dp"
    android:background="?attr/colorPrimaryDark"
    android:padding="16dp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark"
    android:orientation="vertical"
    android:gravity="bottom">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:id="@+id/navhead"
        android:orientation="vertical"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true">

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:textColor="#ffffff"
            android:text="tanya"
            android:textSize="14sp"
            android:textStyle="bold"

            />

        <TextView
            android:id="@+id/email"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#ffffff"
            android:layout_marginLeft="16dp"
            android:layout_marginTop="5dp"
            android:text="tanya.com"
            android:textSize="14sp"
            android:textStyle="normal"

            />
    </LinearLayout>
    <de.hdodenhof.circleimageview.CircleImageView
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:layout_below="@+id/imageView"
        android:layout_marginTop="15dp"

        android:src="@drawable/face"
        android:id="@+id/circleView"
        />



</RelativeLayout>

1

मैं इसे इस तरह कोटलीन में करता हूं:

open class BaseAppCompatActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

protected lateinit var drawerLayout: DrawerLayout
protected lateinit var navigationView: NavigationView
@Inject
lateinit var loginService: LoginService

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    Log.d("BaseAppCompatActivity", "onCreate()")
    App.getComponent().inject(this)
    drawerLayout = findViewById(R.id.drawer_layout) as DrawerLayout

    val toolbar = findViewById(R.id.toolbar) as Toolbar
    setSupportActionBar(toolbar)

    navigationView = findViewById(R.id.nav_view) as NavigationView
    navigationView.setNavigationItemSelectedListener(this)

    val toggle = ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)

    drawerLayout.addDrawerListener(toggle)
    toggle.syncState()
    toggle.isDrawerIndicatorEnabled = true

    val navigationViewHeaderView = navigationView.getHeaderView(0)
    navigationViewHeaderView.login_txt.text = SharedKey.username
}
private inline fun <reified T: Activity> launch():Boolean{
    if(this is T) return closeDrawer()
    val intent = Intent(applicationContext, T::class.java)
    startActivity(intent)
    finish()
    return true
}

private fun closeDrawer(): Boolean {
    drawerLayout.closeDrawer(GravityCompat.START)
    return true
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
    val id = item.itemId

    when (id) {
        R.id.action_tasks -> {
            return launch<TasksActivity>()
        }
        R.id.action_contacts -> {
            return launch<ContactActivity>()
        }
        R.id.action_logout -> {
            createExitDialog(loginService, this)
        }
    }
    return false
}
}

दराज के लिए गतिविधियाँ इसे निर्धारित करना चाहिए BaseAppCompatActivity, super.onCreateसामग्री सेट होने के बाद कॉल करें (वास्तव में, कुछ init विधि में स्थानांतरित किया जा सकता है) और उनके लेआउट में आईडी के लिए संबंधित तत्व हैं


मैं आपके समाधान की कोशिश करना चाहता था, लेकिन मुझे यह त्रुटि मिली: "इस गतिविधि में पहले से ही विंडो सजावट द्वारा आपूर्ति की गई एक बार है"। मैं 3 गतिविधियों के बीच स्विच करना चाहता हूं और एक दूसरे का अपना ऐप बार है। क्या आपको लगता है कि यह संभव है?
रात

मुझे लगता है, आपको उस मामले में अपने एक्शनबार को टुकड़ों में स्थानांतरित करने की आवश्यकता है। हमारे ऐप में हमने NoActionBar थीम का उपयोग किया और संगतता के लिए टूलबार प्रदान किया, जहां तक ​​मुझे याद है।
पावलस

@ कृपया दूसरी गतिविधि पर कोड कैसा दिखेगा? क्लास ट्रैकऐक्टिविटी: BaseAppCompatActivity () {?
क्रेग पी

0

बिना किसी सोर्स कोड के मेरा जवाब सिर्फ एक वैचारिक है। यह कुछ पाठकों के लिए उपयोगी हो सकता है जैसे खुद को समझना।

यह आपके प्रारंभिक दृष्टिकोण पर निर्भर करता है कि आप अपने ऐप को कैसे आर्किटेक्चर करते हैं। मूल रूप से दो दृष्टिकोण हैं।

  1. आप एक गतिविधि (आधार गतिविधि) बनाते हैं और अन्य सभी दृश्य और स्क्रीन टुकड़े होंगे। उस आधार गतिविधि में दराज और समन्वयक लेआउट के लिए कार्यान्वयन शामिल है। यह वास्तव में करने का मेरा पसंदीदा तरीका है क्योंकि छोटे आत्म-निहित अंश होने से ऐप का विकास आसान और आसान हो जाएगा।

  2. यदि आपने गतिविधियों के साथ अपना ऐप डेवलप करना शुरू कर दिया है, तो प्रत्येक स्क्रीन के लिए, तो आप संभवतः आधार गतिविधि बनाएंगे, और अन्य सभी गतिविधि इससे प्राप्त होती है। आधार गतिविधि में दराज और समन्वयक कार्यान्वयन के लिए कोड होगा। किसी भी गतिविधि को दराज के कार्यान्वयन की आवश्यकता होती है जो आधार गतिविधि से बढ़ सकती है।

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


-1

टुकड़ा का उपयोग कर अपने MainActivity में नेविगेशन दराज बनाएँ।
मेनएक्टिविटी में नेविगेशन ड्रावर को प्रारंभ करें
अब अन्य सभी गतिविधियों में आप उसी नेविगेशन ड्रावर का उपयोग करना चाहते हैं जो ड्रावर को आधार के रूप में रखता है और नेविगेशन ड्रावर के रूप में टुकड़े करता है। बस एंड्रॉइड सेट करें: आपके टुकड़े में नाम आपकी खंडित जावा फ़ाइल की ओर इशारा करता है। आपको अन्य गतिविधियों में टुकड़े को इनिशियलाइज़ करने की आवश्यकता नहीं होगी।
आप Google Play Store ऐप जैसी अन्य गतिविधियों में स्वाइप करके नव दराज को एक्सेस कर सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.