Android ActionBar बैक बटन कैसे लागू करें?


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);onCreate में और switch (item.getItemId()) {case android.R.id.home: onBackPressed();break;}में onOptionsItemSelected? दोनों ServicesViewActivity में
सेल्विन

7
क्यों नहीं एक उत्तर ठंडे बस्ते में डालने के रूप में?
कार्लकर्ल्सॉम

जवाबों:


264

सेल्विन ने पहले ही सही जवाब पोस्ट कर दिया। यहाँ, सुंदर कोड में समाधान:

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)को आपको AndroidManifest.xml फ़ाइल में मूल गतिविधि को परिभाषित करने की आवश्यकता है

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

आगे पढ़ने के लिए यहां देखें


1
अपनी स्थिति में मैं एक रास्ते की तलाश कर रहा था, ताकि वापस लौटने पर माता-पिता का फोन न उठाऊं। ऐसा करने के लिए, मैंने आपके कार्यान्वयन का उपयोग किया, लेकिन NavUtils.navigateUpFromSameTask (यह) के बजाय फिनिश () कहा। खत्म () onCreate के बजाय मेरे ऑनस्टार्ट को कॉल करता है जो मेरे लिए अधिक आदर्श था।
जॉन

प्रकट में मेटा-डेटा सेट करना नेविगेशन बटन को काम करने के लिए एक कुंजी है
VSB

getActionBar().setDisplayHomeAsUpEnabled(true);आप उपयोग कर रहे हैं समर्थन पुस्तकालयों का उपयोग करें ।
अभिनव उपाध्याय

आप "वाइप" की दिशा कैसे बदलते हैं? डिफ़ॉल्ट रूप से, इस बैक नेविगेशन को लागू करने से स्क्रीन दाईं से बाईं ओर स्वीप हो जाती है, और ऐसा लगता है कि यह एक नई स्क्रीन को लोड कर रहा है। हालांकि, मैं चाहता हूं कि यह बाएं से दाएं पोंछे, ठीक उसी तरह जैसे डिवाइस को पीछे की तरफ मारना।
स्टिंगरे_

मुझे त्रुटि मिली: इसके कारण: java.lang.NullPointerException: वर्चुअल विधि 'void android.app.ActionBar.setDisplayHomeAsUpEnabled (बूलियन)' को एक अशक्त वस्तु संदर्भ में प्राप्त करने का प्रयास
जोन्स

166

सुनिश्चित करें कि आपका एक्शनबार होम बटन गतिविधि में सक्षम है:

Android, API 5+:

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

ActionBarSherlock और ऐप-संगत, एपीआई 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);
        }
    }
}

इस तरह आप चाहते हैं कि सभी गतिविधियों backpress हो सकता है।

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 () को सेट करता हूं। setDisplayHomeAsUpEnabled (सच); to getActionBar ()। setDisplayHomeAsUpEnabled (सच); और इन @SuppressLint ("NewApi") को onCreate मेथड के अंदर और बाहर जोड़ा गया REF: => developer.android.com/training/implementing-navigation/…
gnganpath 13/15

1
@ganpath सावधान, getActionBar का उपयोग API 11+ के लिए है
जारेड बुर

17

ActionBar बैक बटन को सक्षम करने के लिए आपको स्पष्ट रूप से अपनी गतिविधि में ActionBar की आवश्यकता है। यह आपके द्वारा उपयोग की जा रही थीम द्वारा सेट किया गया है। आप अपनी गतिविधि के लिए विषय सेट कर सकते हैं AndroidManfiest.xml। यदि आप उदाहरण के लिए @android:style/Theme.NoTitleBarविषय का उपयोग कर रहे हैं , तो आप एक ActionBar नहीं है। इस स्थिति में कॉल getActionBar()निरस्त हो जाएगी। तो सुनिश्चित करें कि आपके पास पहले एक ActionBar है।

अगला कदम 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यह अपने app दुर्घटना होगा।

कभी-कभी यही आप चाहते हैं क्योंकि यह आपको याद दिला रहा है कि आप "कुछ" भूल गए हैं। इसलिए यदि आप इसे रोकना चाहते हैं, तो आप जांच सकते हैं कि क्या आपकी गतिविधि में 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

AndroidManifest फ़ाइल:

    <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


4

मुझे लगता onSupportNavigateUp()है कि ऐसा करना सबसे सरल और अच्छा तरीका है

इस लिंक में कोड की जाँच करें पूर्ण कोड के लिए यहां क्लिक करें


1
महान! मेरे लिये कार्य करता है। धन्यवाद!
मोरजा

3

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

इसे प्राप्त करने के लिए, बस दो चरण हैं,

चरण 1: AndroidManifest.xml पर जाएं और टैग में पैरामीटर जोड़ें - Android: parentActivity.ame = "। Home.HomeActivity"।

उदाहरण :

 <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

OnCreate विधि में इसे जोड़ें:

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

फिर इस विधि को जोड़ें:

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


1

यदि आप टूलबार का उपयोग कर रहे हैं, तो मैं उसी मुद्दे का सामना कर रहा था। मैंने इन दो चरणों का पालन करके हल किया

  1. AndroidManifest.xml में
<activity android:name=".activity.SecondActivity" android:parentActivityName=".activity.MainActivity"/>
  1. SecondActivity में, ये जोड़ें ...
Toolbar toolbar = findViewById(R.id.second_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

0

निम्न चरण बैक बटन के लिए पर्याप्त हैं:

चरण 1: यह कोड Manifest.xml में होना चाहिए

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