কীভাবে অ্যান্ড্রয়েড অ্যাকশনবারের ব্যাক বোতামটি প্রয়োগ করবেন?


137

আমার একটি তালিকা ভিউ সহ একটি ক্রিয়াকলাপ রয়েছে। ব্যবহারকারী যখন আইটেমটি ক্লিক করেন, তখন আইটেমটি "ভিউয়ার" খোলে:

List1.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {

        Intent nextScreen = new Intent(context,ServicesViewActivity.class);
        String[] Service = (String[])List1.getItemAtPosition(arg2);

        //Sending data to another Activity
        nextScreen.putExtra("data", datainfo);
        startActivityForResult(nextScreen,0);
        overridePendingTransition(R.anim.right_enter, R.anim.left_exit);
    }
});

এটি দুর্দান্ত কাজ করে তবে অ্যাকশনবারে অ্যাপ্লিকেশন আইকনের পাশের তীরটি সক্রিয় হয় না। আমি কিছু অনুপস্থিত করছি?


64
getActionBar().setDisplayHomeAsUpEnabled(true);অনক্রিট এবং switch (item.getItemId()) {case android.R.id.home: onBackPressed();break;}ইন onOptionsItemSelected? উভয়ই
সার্ভিসভিউঅ্যাক্টিভিটি

7
একটি উত্তর তাক হিসাবে কেন না?
কার্লকার্লসম

উত্তর:


263

সেলভিন ইতিমধ্যে সঠিক উত্তর পোস্ট করেছেন। এখানে, সুন্দর কোডে সমাধান:

public class ServicesViewActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // etc...
        getActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }
}

ফাংশনটির NavUtils.navigateUpFromSameTask(this)জন্য আপনাকে AndroidManLive.xML ফাইলে পিতামাতার ক্রিয়াকলাপটি সংজ্ঞায়িত করতে হবে

<activity android:name="com.example.ServicesViewActivity" >
    <meta-data
     android:name="android.support.PARENT_ACTIVITY"
     android:value="com.example.ParentActivity" />
</activity>

আরও পড়ার জন্য এখানে দেখুন ।


1
আমার পরিস্থিতিতে আমি পিতামাতার কাছে ফিরে আসার সময় ক্রেটকে কল না করার উপায় খুঁজছিলাম। এটি করার জন্য, আমি আপনার বাস্তবায়নটি ব্যবহার করেছি, তবে NavUtils.navigateUpFromSameTask (এটি) এর পরিবর্তে ফিনিশ () বলে। ফিনিস () অনক্রেটের পরিবর্তে আমার অন স্টার্টকে কল করে যা আমার জন্য আরও আদর্শ।
জন

ম্যানিফেস্টে মেটা-ডেটা সেট করা নেভিগেশন বোতামটি কাজ করার জন্য একটি চাবিকাঠি
ভিএসবি

ব্যবহারের getActionBar().setDisplayHomeAsUpEnabled(true);আপনি সমর্থন লাইব্রেরি ব্যবহার করছেন আধারস্থ।
অভিনব উপাধ্যায়

আপনি "মুছা" এর দিকটি কীভাবে পরিবর্তন করবেন? ডিফল্টরূপে, এই পিছনে নেভিগেশন বাস্তবায়ন স্ক্রিনটিকে ডান থেকে বামে সোয়েপ করে এবং দেখে মনে হচ্ছে এটি কোনও নতুন স্ক্রীন লোড করছে। যাইহোক, আমি ডিভাইসের নিজস্ব পিছনের কীটি আঘাত করার মতো এটি বাম থেকে ডানে মুছতে চাই।
স্টিংরে_

আমি ত্রুটিটি পেয়েছি: এর দ্বারা: java.lang. নালপয়েন্টার এক্সসেপশন: নাল বস্তুর রেফারেন্সে ভার্চুয়াল পদ্ধতি 'শূন্যর android.app.ActionBar.setDisplayHomeAsUpEn सक्षम (বুলিয়ান)' আহ্বান করার চেষ্টা
জোনস

166

আপনার অ্যাকশনবার হোম বাটনটি ক্রিয়াকলাপে সক্ষম হয়েছে তা নিশ্চিত করুন:

Android, API 5+:

@Override
public void onBackPressed() {
     ...
     super.onBackPressed();
}

অ্যাকশনবারেরলক এবং অ্যাপ-কম্প্যাট, এপিআই 7+:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    ...
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

Android, API 11+:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    ...
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

উদাহরণ MainActivityযা প্রসারিত ActionBarActivity:

public class MainActivity extends ActionBarActivity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home: 
            // API 5+ solution
            onBackPressed();
            return true;

        default:
            return super.onOptionsItemSelected(item);
        }
    }
}

আপনি চান সমস্ত ক্রিয়াকলাপের ব্যাকপ্রেস থাকতে পারে।

Android, API 16+:

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

AndroidManifest.xml:

<application ... >
    ...
    <!-- The main/home activity (it has no parent activity) -->
    <activity
        android:name="com.example.myfirstapp.MainActivity" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        android:name="com.example.myfirstapp.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <!-- The meta-data element is needed for versions lower than 4.1 -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

উদাহরণ MainActivityযা প্রসারিত ActionBarActivity:

public class MainActivity extends ActionBarActivity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        // Respond to the action bar's Up/Home button
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

যখন আমি getSupportActionBar () .SDDplayplayHomeAsUpEn सक्षम (সত্য) পরিবর্তন করি তখন এটি আমার জন্য কাজ করে; getActionBar () এ। setDisplayHomeAsUpEn सक्षम (সত্য); এবং এই @ সপ্রেসলিঙ্কটি ("নিউএপিপি") এর অভ্যন্তরে ও বাহিরের জন্য অনক্রিয়া পদ্ধতিতে যুক্ত করেছেন রেফ: => বিকাশকারী.অ্যান্ড্রয়েড
ট্রেনিং

1
@ganpath যত্নশীল, getActionBar ব্যবহার করা হয়েছে এপিআই 11+ এর জন্য
জ্যারেড বুরোজ

17

অ্যাকশনবারের পিছনের বোতামটি সক্ষম করতে আপনার ক্রিয়াকলাপে অবশ্যই অ্যাকশনবারের প্রয়োজন। এটি আপনি ব্যবহার করছেন থিম দ্বারা সেট করা হয়। আপনি আপনার ক্রিয়াকলাপের জন্য থিমটি সেট করতে পারেন AndroidManfiest.xml। আপনি যদি উদাহরণস্বরূপ @android:style/Theme.NoTitleBarথিমটি ব্যবহার করছেন তবে আপনার কাছে অ্যাকশনবার নেই have এই ক্ষেত্রে কলটি getActionBar()বাতিল হয়ে যাবে। সুতরাং নিশ্চিত হয়ে নিন যে আপনার প্রথমে অ্যাকশনবার রয়েছে।

পরবর্তী পদক্ষেপটি android:parentActivityNameআপনি পিছনের বোতামটি টিপলে আপনি নেভিগেট করতে চান এমন ক্রিয়াকলাপটি সেট করা । AndroidManifest.xmlএটিও করা উচিত ।

এখন আপনি onCreateআপনার "শিশু" ক্রিয়াকলাপের পদ্ধতিতে পিছনের বোতামটি সক্ষম করতে পারেন ।

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

এখন আপনার পিছনের বোতামটির জন্য যুক্তিটি প্রয়োগ করা উচিত। আপনি কেবল onOptionsItemSelectedআপনার "শিশু" ক্রিয়াকলাপে পদ্ধতিটি ওভাররাইড করে এবং পিছনের বোতামটির আইডি যাচাই করে দেখুন android.R.id.home

এখন আপনি পদ্ধতি ফায়ার করতে পারেন NavUtils.navigateUpFromSameTask(this); কিন্তু আপনি নির্দিষ্ট করেছেন আত যদি android:parentActivityNameআপনি AndroidManifest.xmlএই আপনার অ্যাপ বিপর্যস্ত হবে।

কখনও কখনও এটি আপনি চান যা এটি আপনাকে স্মরণ করিয়ে দেয় যে আপনি "কিছু" ভুলে গেছেন। সুতরাং আপনি যদি এটি প্রতিরোধ করতে চান, আপনি এই getParentActivityIntent()পদ্ধতিটি ব্যবহার করে আপনার ক্রিয়াকলাপের কোনও পিতামাতার রয়েছে কিনা তা পরীক্ষা করতে পারেন । যদি এটি শূন্য হয়, আপনি পিতামাতাকে নির্দিষ্ট করেন নি।

এই ক্ষেত্রে আপনি সেই onBackPressed()পদ্ধতিটি ফায়ার করতে পারেন যা মূলত একইভাবে হয় যদি ব্যবহারকারীটি ডিভাইসে পিছনের বোতামটি টিপায়। আপনার অ্যাপ্লিকেশনটিকে ক্র্যাশ করে না এমন একটি ভাল বাস্তবায়ন হ'ল:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            if (getParentActivityIntent() == null) {
                Log.i(TAG, "You have forgotten to specify the parentActivityName in the AndroidManifest!");
                onBackPressed();
            } else {
                NavUtils.navigateUpFromSameTask(this);
            }
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

অনুগ্রহ করে লক্ষ্য করুন যে ব্যবহারকারীরা যে অ্যানিমেশনটি দেখে তা NavUtils.navigateUpFromSameTask(this);এবং এর মধ্যে আলাদা onBackPressed()

আপনি কোন রাস্তাটি অবলম্বন করবেন এটি আপনার উপর নির্ভর করে তবে সমাধানটি আমি সহায়ক বলে মনে করেছি, বিশেষত যদি আপনি আপনার সমস্ত কাজের জন্য একটি বেস ক্লাস ব্যবহার করেন।


10

অ্যান্ড্রয়েডমেনিস্ট ফাইল:

    <activity android:name=".activity.DetailsActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="br.com.halyson.materialdesign.activity.HomeActivity" />
    </activity>

বিশদ ক্রিয়াকলাপে যুক্ত করুন:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);   
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

এটি কাজ:]


মনে হচ্ছে এটি আমার পক্ষে সবচেয়ে সহজ উপায়। আপনাকে ধন্যবাদ
TuanDPH



3

https://stackoverflow.com/a/46903870/4489222

এটি অর্জনের জন্য, কেবল দুটি পদক্ষেপ রয়েছে,

পদক্ষেপ 1: অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল এ যান এবং ট্যাগের মধ্যে প্যারামিটার যুক্ত করুন - অ্যান্ড্রয়েড: প্যারেন্টএকটিভিটির নাম = "। হোম.হোমঅ্যাক্টিভিটি"

উদাহরণ:

 <activity
    android:name=".home.ActivityDetail"
    android:parentActivityName=".home.HomeActivity"
    android:screenOrientation="portrait" />

পদক্ষেপ 2: ক্রিয়াকলাপে পূর্বের পৃষ্ঠা / ক্রিয়াকলাপের জন্য আপনার ক্রিয়া যুক্ত করুন

উদাহরণ:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
   switch (item.getItemId()) {
      case android.R.id.home: 
          onBackPressed();
          return true;
   }
   return super.onOptionsItemSelected(item);}
}

3

অনক্রিয়েট পদ্ধতিতে এটি যুক্ত করুন:

if (getSupportActionBar() != null)
    {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

তারপরে এই পদ্ধতিটি যুক্ত করুন:

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}


1

আপনি যদি সরঞ্জামদণ্ড ব্যবহার করে থাকেন তবে আমি একই সমস্যার মুখোমুখি ছিলাম। আমি এই দুটি পদক্ষেপ অনুসরণ করে সমাধান

  1. অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল এ
<activity android:name=".activity.SecondActivity" android:parentActivityName=".activity.MainActivity"/>
  1. দ্বিতীয় ক্রিয়াকলাপে, এগুলি যুক্ত করুন ...
Toolbar toolbar = findViewById(R.id.second_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

0

নিম্নলিখিত পদক্ষেপগুলি পিছনে বোতামটি যথেষ্ট:

পদক্ষেপ 1: এই কোডটি ম্যানিফেস্ট.এক্সএমএলে থাকা উচিত

<activity android:name=".activity.ChildActivity"
        android:parentActivityName=".activity.ParentActivity"
        android:screenOrientation="portrait">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".activity.ParentActivity" /></activity>

পদক্ষেপ 2: আপনি দেবেন না

finish();

শিশু ক্রিয়াকলাপ শুরু করার সময় আপনার মূল কার্যকলাপে।

পদক্ষেপ 3: আপনার যদি শিশু ক্রিয়াকলাপ থেকে মূল ক্রিয়াকলাপে ফিরে আসতে হয় তবে আপনি কেবল শিশু ক্রিয়াকলাপের জন্য এই কোডটি দিন।

startActivity(new Intent(ParentActivity.this, ChildActivity.class));

0

জ্যারেডের উত্তরের ভিত্তিতে, আমাকে বেশ কয়েকটি ক্রিয়াকলাপে অ্যাকশন বার ব্যাক বোতাম আচরণ সক্ষম এবং প্রয়োগ করতে হয়েছিল এবং কোডের নকল হ্রাস করতে এই সহায়ক ক্লাসটি তৈরি করেছিলাম।

public final class ActionBarHelper {
    public static void enableBackButton(AppCompatActivity context) {
        if(context == null) return;

        ActionBar actionBar = context.getSupportActionBar();
        if (actionBar == null) return;

        actionBar.setDisplayHomeAsUpEnabled(true);
    }
}

একটি ক্রিয়াকলাপে ব্যবহার:

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

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