বিভিন্ন ক্রিয়াকলাপে একই নেভিগেশন ড্রয়ার


206

এটি একটি বিকাশকারী নেভিগেশন ড্রয়ারটি তৈরি করেছি যেমন এটি বিকাশকারী.অ্যান্ড্রয়েড.কমের টিউটোরিয়ালে প্রদর্শিত হয় ওয়েবসাইটের । তবে এখন, আমি আমার অ্যাপ্লিকেশনের একাধিক ক্রিয়াকলাপের জন্য নেভিগেশনড্রেয়ার.ক্লাসে তৈরি একটি নেভিগেশন ড্রয়ার ব্যবহার করতে চাই।

আমার প্রশ্ন হ'ল এখানে যদি কেউ সামান্য টিউটোরিয়াল তৈরি করতে পারে তবে এটি ব্যাখ্যা করে যে কীভাবে একাধিক ক্রিয়াকলাপের জন্য একটি নেভিগেশন ড্রয়ার ব্যবহার করতে হয়।

আমি প্রথমে একাধিক ক্রিয়াকলাপের এই উত্তর এন্ড্রয়েড নেভিগেশন ড্রয়ারে পড়েছি

তবে এটি আমার প্রকল্পে কাজ করে নি

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>

সম্পাদনা:

আমি নিজে কিছু অসুবিধা ভোগ করেছি, সুতরাং নুলপয়েন্টারএক্সেপশনগুলি পেয়ে গেলে এখানে একটি সমাধান। BaseActivity ইন onCreate ফাংশন পরিবর্তন protected void onCreateDrawer()। বাকিরা একই রকম থাকতে পারে। বেসঅ্যাক্টিভিটি প্রসারিত ক্রিয়াকলাপগুলিতে কোডটি এই ক্রমে রাখুন:

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

এটি আমার সমস্যার সমাধান করতে সহায়তা করেছে, আশা করি এটি সাহায্য করবে!

আপনার যদি কোনও প্রশ্ন থাকে তবে নির্দ্বিধায় যদি আপনি একাধিক ক্রিয়াকলাপ সহ একটি নেভিগেশন ড্রয়ার তৈরি করতে পারেন।


সম্পাদনা 2:

@ গ্রেগড্যানের কথা অনুসারে আপনি BaseActivityওভাররাইড করতে এবং setContentView()সেখানে ক্রেইটড্রেয়ারকে কল করতে পারেন :

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

7
আমি টুকরাগুলির উপরে ক্রিয়াকলাপগুলি ব্যবহার করতে চাই না, আমি কেবলমাত্র বিভিন্ন ক্রিয়াকলাপ ব্যবহার করতে চাই যা সমস্ত একই নেভিগেশন ড্রয়ার ব্যবহার করে। আমি ক্রিয়াকলাপ চাই, কারণ সেখানে আমি বিভিন্ন ধরণের লেআউট যেমন সোয়াইপ ভিউ, মানচিত্রের ভিউ ব্যবহার করতে পারি ...
মেক্স

135
যে কোনও মোটামুটি জটিল অ্যাপ্লিকেশনের জন্য মাত্র একটি ক্রিয়াকলাপ হওয়া একটি দু: খজনক কাজ হতে পারে। ক্রিয়াকলাপগুলি ব্যবহার করা আপনাকে সিস্টেম থেকে প্রচুর বিনামূল্যে জিনিস দেয় - তাই একাধিক ক্রিয়াকলাপ কীভাবে ব্যবহার করতে হয় এটি একটি বৈধ পয়েন্ট। যে কোনও সংখ্যক খণ্ড সংমিশ্রণের মধ্যে যোগাযোগ পরিচালনা করে এমন একটি কার্যকলাপ আমি কল্পনা করতে পারি না - এটি কেবল কাজ করবে না।
স্লট

1
আমি দুঃখিত আমি উত্তর দিতে এত দিন লেগেছিল। আমি আমার উত্তর সম্পাদনা করেছি। আমি বিশ্বাস করি এটি সেই টিউটোরিয়াল যা আপনি অনুসন্ধান করেছিলেন। আশাকরি এটা সাহায্য করবে.
কেভিন ভ্যান মিয়ার্লো

2
@ কেভিনওয়ানমিয়েরো আপনি কী বলতে চান তা আমাকে বলতে পারেন: R.id.drawer_layout প্রতিটি আইডিতে ঠিক একই আইডি থাকা উচিত with কারণ আপনি এখানে যা বলেছিলেন ঠিক তেমনই আমি করেছি এবং এই বেসঅ্যাক্টিভিটি প্রসারিত ক্রিয়াকলাপের অনক্রিট () পদ্ধতিতে আমি একটি নালপয়েন্টার এক্সসেপশন পেয়েছি ..
লুলুয়ি

1
কেভিনওয়ানমিয়েরো বিটিডব্লু, আমার মনে হয় আপনি এই দুটি লাইন ভুলে গেছেন? super.onCreate (savedInstanceState); setContentView (R.layout.activity_base);
Looooii

34

আমি সেরা বাস্তবায়ন পেয়েছি। এটি গুগল আই / ও ২০১৪ এ রয়েছে অ্যাপে রয়েছে

তারা কেভিনের মতো একই পদ্ধতি ব্যবহার করে। আপনি যদি I / O অ্যাপ্লিকেশনটিতে সমস্ত অপ্রয়োজনীয় স্টাফ থেকে নিজেকে বিমূর্ত করতে পারেন তবে আপনি যা যা প্রয়োজন তা সব বের করতে পারেন এবং এটি গুগল দ্বারা নিশ্চিত করা হয়েছে যে এটি নেভিগেশন ড্রয়ারের ধরণটির সঠিক ব্যবহার। প্রতিটি ক্রিয়াকলাপ option 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 তারা সম্ভবত এর সাথে ক্রিয়াকলাপের অ্যানিমেশনটিকে ওভাররাইড করে overridePendingTransitions
এপিকপান্ডাফোরস্

সাবক্লাসিং কার্যক্রমের পরিবর্তে খণ্ডগুলি লোড করা হচ্ছে?
বিকাশ পান্ডে

অক্টোবর ২০১৪ থেকে ফাইলটি এখানে: github.com/google/iosched/blob/…
denvercoder9

8

সুতরাং এই উত্তরটি কয়েক বছর দেরীতে হলেও কেউ এর প্রশংসা করতে পারে। অ্যান্ড্রয়েড আমাদের একটি নতুন উইজেট দিয়েছে যা একাধিক ক্রিয়াকলাপ সহ একটি নেভিগেশন ড্রয়ার ব্যবহার করে।

android.support.design.widget. নেভিগেশনভিউ মডুলার এবং মেনু ফোল্ডারে এটির নিজস্ব লেআউট রয়েছে। আপনি যেভাবে এটি ব্যবহার করেন তা হ'ল এক্সএমএল লেআউটগুলি নিম্নলিখিত পদ্ধতিতে মোড়ানো:

  1. রুট <include ... />লেআউটটি একটি Android.support.v4.widget.DrawerLayout যা দুটি শিশু রয়েছে: একটি লেআউট যা মোড়ানো হচ্ছে (2 দেখুন) এবং একটি android.support.design.widget. নেভিগেশনভিউ।

    <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" />

আপনার নেভিগেশন ড্রয়ারের শিরোনামের জন্য NEW_header_main হ'ল ওরিয়েন্টেশন = উল্লম্ব সহ একটি লিনিয়ারালআউট।

কার্যকলাপ_মাইন_ড্রেওয়ারটি আপনার রেজ / মেনু ডিরেক্টরিতে একটি মেনু এক্সএমএল। এটিতে আপনার পছন্দের আইটেম এবং গোষ্ঠীগুলি থাকতে পারে। আপনি যদি অ্যান্ড্রয়েড স্টুডিও গ্যালারী ব্যবহার করেন তবে উইজার্ডটি আপনার জন্য একটি প্রাথমিক তৈরি করবে এবং আপনার বিকল্পগুলি কী তা আপনি দেখতে পাবেন।

  1. অ্যাপ বারের লেআউটটি সাধারণত এখন একটি অ্যান্ড্রয়েড.সপোর্ট.ডিজাইন.উইজেট.কর্ডিনেটর লেআউট হয় এবং এর মধ্যে দুটি বাচ্চা অন্তর্ভুক্ত থাকে: একটি অ্যান্ড্রয়েড.সপ্পার্ট.ডিজাইন.উইডজেট.অ্যাপবারলআউট (যা একটি 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 দেখুন) সর্বদা ক্রিয়াকলাপ_মাইন_ড্রওয়ার (বা যাই হোক না কেন) point এর অর্থ হল যে সমস্ত ক্রিয়াকলাপে আপনার একই (*) নেভিগেশন ড্রয়ার থাকবে।

  • এগুলি নেভিগেশনভিউয়ের একই উদাহরণ নয় তবে, যথার্থ হ'ল উপরে বর্ণিত বেসঅ্যাক্টিভিটি সমাধান দিয়েও এটি সম্ভব ছিল না।

স্ট্যাকওভারফ্লো কিছু ঘেরযুক্ত এক্সএমএল বন্ধনী কেটে দিচ্ছে তবে গুরুত্বপূর্ণ জিনিসগুলি সেখানে রয়েছে there
জোহরেল

তবে আপনি কীভাবে বোতামগুলির মতো কার্যকারিতাটি আচরণ করবেন? আপনার অবশ্যই প্রতিটি ক্রিয়াকলাপে একই কোডটি লিখতে হবে?
লর 89

হ্যাঁ, কারণ এগুলি পৃথক দৃষ্টান্ত। তবে, আপনার ক্রিয়াকলাপগুলি প্রসারিত করার জন্য এবং সেই কোডটি একবারে এখানে রাখার জন্য আপনি একটি সুপার ক্লাস করতে পারেন।
জোহরেল

@ জোহরেললে আপনি কি আমাদের ক্রিয়াকলাপের জন্য একটি সুপার ক্লাস তৈরির বিষয়ে উদাহরণ লিখতে পারেন?
সিড্রোসস

প্রকাশ্য বিমূর্ত বর্গ 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 এবং setContentViewপূর্বনির্ধারিত ডিফল্ট পথে কাজ করা উচিত।
লেভন পেট্রোসায়ান

6

আসল পোস্টারটি যা জিজ্ঞাসা করছে তা করতে অন্য কারও জন্য, দয়া করে কেভিন যেভাবে বলেছেন তার পরিবর্তে খণ্ডগুলি ব্যবহার করার বিষয়ে বিবেচনা করুন। এটি করার জন্য একটি চমৎকার টিউটোরিয়াল এখানে:

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

আপনি যদি টুকরোগুলির পরিবর্তে ক্রিয়াকলাপগুলি ব্যবহার করার সিদ্ধান্ত নেন তবে প্রতিবার নতুন ক্রিয়াকলাপে নেভিগেট করার সময় আপনি ন্যাভ ড্রয়ারটি পুনরায় তৈরি হওয়ার সমস্যায় পড়তে চলেছেন। এটি প্রতিবার নেভ ড্রয়ারের একটি কুৎসিত / ধীর রেন্ডারিংয়ের ফলস্বরূপ।


5

আমার পরামর্শটি হ'ল: ক্রিয়াকলাপটি মোটেও ব্যবহার করবেন না, পরিবর্তে টুকরোগুলি ব্যবহার করুন এবং সেগুলি পাত্রে প্রতিস্থাপন করুন (উদাহরণস্বরূপ লিনিয়ার লেআউট) যেখানে আপনি আপনার প্রথম খণ্ডটি দেখান।

কোডটি অ্যান্ড্রয়েড বিকাশকারী টিউটোরিয়ালে উপলভ্য, আপনাকে কেবল কাস্টমাইজ করতে হবে।

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

আপনার অ্যাপ্লিকেশনটিতে আরও বেশি করে টুকরো টুকরো ব্যবহার করা উচিত এবং আপনার আবেদনের স্থানীয় মাত্র চারটি বেসিক ক্রিয়াকলাপ হওয়া উচিত, যা আপনি আপনার অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএলে উল্লেখ করেছেন (উদাহরণস্বরূপ ফেসবুক অ্যাক্টিভিটি):

  1. স্প্ল্যাশঅ্যাক্টিভিটি: কোনও খণ্ড ব্যবহার করে না এবং ফুলস্ক্রিন থিম ব্যবহার করে।

  2. লগইনসাইনআপ্টিভিটি: নেভিগেশনড্রেয়ার মোটেও প্রয়োজন হবে না, পাশাপাশি কোনও পিছনের বোতামও নেই, তাই সাধারণ সরঞ্জামদণ্ডটি সহজেই ব্যবহার করুন, তবে কমপক্ষে 3 বা 4 টুকরা প্রয়োজন। নন-অ্যাকশন-বার থিম ব্যবহার করে

  3. হোমঅ্যাক্টিভিটি বা ড্যাশবোর্ড ক্রিয়াকলাপ: নন-অ্যাকশন-বার থিম ব্যবহার করে। এখানে আপনার নেভিগেশন ড্রয়ারের প্রয়োজন রয়েছে, এছাড়াও অনুসরণ করা সমস্ত পর্দা ভাগ করা ড্রয়ারের সাথে পাতার দর্শন পর্যন্ত টুকরো বা নেস্টেড টুকরো হবে। সমস্ত ক্রিয়াকলাপ, ব্যবহারকারীর প্রোফাইল এবং ইত্যাদি এখানে এই ক্রিয়াকলাপে টুকরো টুকরো হিসাবে থাকবে। এখানে টুকরো টুকরো পিছনে স্ট্যাক যুক্ত করা হবে না এবং ড্রয়ার মেনু আইটেম থেকে খোলা হবে। টুকরাগুলির ক্ষেত্রে যেখানে ড্রয়ারের পরিবর্তে ব্যাক বোতামের প্রয়োজন হয়, নীচে চতুর্থ ধরণের ক্রিয়াকলাপ রয়েছে।

  4. ড্রয়ার ছাড়াই ক্রিয়াকলাপ। এই ক্রিয়াকলাপটির উপরে একটি পিছনের বোতাম রয়েছে এবং ভিতরে থাকা খণ্ডগুলি একই ক্রিয়া-বারটি ভাগ করে নেবে। এই টুকরোগুলি ব্যাক-স্ট্যাকটিতে যুক্ত করা হবে, কারণ এখানে নেভিগেশন ইতিহাস থাকবে।

[আরও গাইডেন্সের জন্য দেখুন: https://stackoverflow.com/a/51100507/787399 ]

শুভ কোডিং !!


এটি একটি পুরানো পোস্ট। আপনার সর্বদা একটি ক্রিয়াকলাপ রয়েছে তা নিশ্চিত করতে আপনি টুকরোগুলি ব্যবহার করতে পারেন। আপনি এটিতে উত্সর্গীকৃত একটি পাত্রে টুকরোগুলি প্রতিস্থাপন করে চলেছেন। আপনার পিছনের নেভিগেশন প্রয়োজন হলে পিছনে স্ট্যাক রাখুন, বা যখন প্রথম অংশ হিসাবে দেখানোর জন্য কোনও টুকরো দরকার তখন সমস্ত টুকরো পপ করুন।
অভিনব সাক্সেনা

@ ক্যাবক্সা.ম্যাপছে আরও সহায়তা পাওয়ার জন্য দয়া করে আমার উত্তরের সংযুক্ত লিঙ্কটি পরীক্ষা করুন। আমি একটি সাধারণ বেসঅ্যাক্টিভিটি নিয়েছি, যা অ্যাকশনবার টুলবার এবং নাভিগাটনড্রেভার এবং এর সাথে সংযুক্ত সমস্ত টুকরোতে অন্যান্য উপাদানগুলিকে ভাগ করে নিতে সহায়তা করে।
অভিনব সাক্সেনা

1

বেসাকটিভিটিতে এই কোডটি আপডেট করুন। এবং আপনার ক্রিয়াকলাপের এক্সএমএলে ড্রয়ার_লিস্ট_হেডারটি অন্তর্ভুক্ত করতে ভুলবেন না।

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

এবং আপনার ক্রিয়াকলাপে অনুরোধ () ব্যবহার করবেন না। তবে চিত্রটি ক্লিক করার পরেও ড্রয়ারটি দৃশ্যমান নয়..এটি টেনে এনে তালিকাগুলি আইটেম ছাড়াই দৃশ্যমান হবে। আমি অনেক চেষ্টা করেও সফল হই নি। এর জন্য কিছু ওয়ার্কআউট দরকার ...


1

@ কেভিন ভ্যান মিয়ারলোর জবাবের সাথে আপনি বেশ কয়েকটি ড্রয়ার প্রয়োগ করতেও সক্ষম। উদাহরণস্বরূপ, বাম পাশে অবস্থিত ডিফল্ট মেনু (শুরু) এবং ডানদিকে অবস্থিত আরও একটি alচ্ছিক মেনু, যা কেবলমাত্র যখন টুকরোগুলি স্থির করে তা বোঝানো হয়।

আমি এটা করতে সক্ষম হয়েছি।


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 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সামগ্রী সেট হওয়ার পরে কল করুন (আসলে, কিছুটা ডি পদ্ধতিতে স্থানান্তরিত হতে পারে) এবং তাদের বিন্যাসে আইডির জন্য সংশ্লিষ্ট উপাদান থাকতে হবে


আমি আপনার সমাধানটি চেষ্টা করতে চেয়েছিলাম কিন্তু আমি এই ত্রুটিটি পেয়েছি: "এই ক্রিয়াকলাপটিতে উইন্ডো সজ্জা দ্বারা সরবরাহ করা ইতিমধ্যে একটি অ্যাকশন বার রয়েছে"। আমি 3 টি ক্রিয়াকলাপের মধ্যে স্যুইচ করতে চাই এবং একে অপরের নিজস্ব অ্যাপ বার রয়েছে। আপনি কি মনে করেন যে এটি সম্ভব?
ডেভয়েড

আমি মনে করি, আপনার ক্ষেত্রে আপনার ক্রিয়াকলাপটি টুকরো টুকরোতে সরানো দরকার। আমাদের অ্যাপটিতে আমরা NoActionBar থিম ব্যবহার করেছি এবং যতদূর আমার মনে আছে সামঞ্জস্যের জন্য সরঞ্জামদণ্ড সরবরাহ করেছি।
পাভ্লুস

@ পাভলাস দ্বিতীয় ক্রিয়াকলাপটিতে কোডটি কেমন দেখাচ্ছে? ক্লাস ট্র্যাকঅ্যাক্টিভিটি: বেস অ্যাপকম্প্যাটঅ্যাক্টিভিটি () {?
ক্রেগ পি

0

আমার উত্তরটি কোনও উত্স কোড ছাড়াই কেবল একটি ধারণামূলক। এটি আমার মতো কিছু পাঠকের পক্ষে বোঝার জন্য কার্যকর হতে পারে।

আপনি কীভাবে আপনার অ্যাপ্লিকেশনটিকে আর্কিটেকচার করেন তা এটি আপনার প্রাথমিক পদ্ধতির উপর নির্ভর করে। মূলত দুটি পন্থা রয়েছে।

  1. আপনি একটি ক্রিয়াকলাপ তৈরি করেন (বেস ক্রিয়াকলাপ) এবং অন্যান্য সমস্ত দর্শন এবং পর্দা খণ্ড হবে। এই বেস ক্রিয়াকলাপে ড্রয়ার এবং সমন্বয়কারী বিন্যাসগুলির বাস্তবায়ন রয়েছে contains এটি আসলে আমার পছন্দের উপায় কারণ ছোট স্ব-সংযুক্ত টুকরো থাকা অ্যাপ্লিকেশন বিকাশকে সহজ এবং মসৃণ করে তুলবে।

  2. যদি আপনি প্রতিটি স্ক্রিনের জন্য একটি করে ক্রিয়াকলাপের সাথে আপনার অ্যাপ্লিকেশন বিকাশ শুরু করে থাকেন তবে আপনি সম্ভবত বেস ক্রিয়াকলাপটি তৈরি করবেন এবং অন্যান্য সমস্ত ক্রিয়াকলাপ এটি থেকে প্রসারিত হবে। বেস ক্রিয়াকলাপটিতে ড্রয়ার এবং সমন্বয়কারী বাস্তবায়নের কোড থাকবে। যে কোনও ক্রিয়াকলাপে ড্রয়ার বাস্তবায়ন প্রয়োজন বেস ক্রিয়াকলাপ থেকে প্রসারিত হতে পারে।

আমি ব্যক্তিগতভাবে কোনও সংগঠন ছাড়াই টুকরো টুকরো এবং ক্রিয়াকলাপগুলি ব্যবহার করা এড়ানো পছন্দ করি prefer এটি বিকাশকে আরও কঠিন করে তোলে এবং আপনাকে শেষ পর্যন্ত আটকে রাখে। আপনি যদি এটি করেন তবে আপনার কোডটি রিফ্যাক্টর করুন।


-1

টুকরাটি ব্যবহার করে আপনার মেইনএ্যাকটিভিটিতে নেভিগেশন ড্রয়ার তৈরি করুন।
MainActivity মধ্যে নেভিগেশান ড্রয়ার আরম্ভ
অন্য সব কার্যক্রম আপনি একই নেভিগেশান ড্রয়ার বেস ও নেভিগেশান ড্রয়ার যেমন টুকরা হিসাবে DrawerLayout করা ব্যবহার করতে চান এখন। স্রেফ অ্যান্ড্রয়েড সেট করুন: আপনার খণ্ডের নামটি আপনার খণ্ড জাভা ফাইলের দিকে নির্দেশ করছে। অন্যান্য ক্রিয়াকলাপগুলিতে আপনাকে খণ্ডটি আরম্ভ করার প্রয়োজন হবে না।
আপনি গুগল প্লে স্টোর অ্যাপ্লিকেশানের মতো অন্যান্য ক্রিয়াকলাপে সোয়াইপ করে নেভ ড্রয়ার অ্যাক্সেস করতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.