Android: टोस्ट के साथ onBackPressed () का उपयोग करने का उचित तरीका


85

मैंने एक कोड ऑफ़ कोड लिखा था जो उपयोगकर्ता को एक संकेत देगा जो उन्हें फिर से वापस दबाने के लिए कहेगा यदि वे बाहर निकलना चाहेंगे। मेरे पास वर्तमान में मेरा कोड एक हद तक काम कर रहा है, लेकिन मुझे पता है कि यह खराब तरीके से लिखा गया है और मुझे लगता है कि इसे करने का एक बेहतर तरीका है। कोई भी सुझाव महत्वपूर्ण है!

कोड:

public void onBackPressed(){
    backpress = (backpress + 1);
    Toast.makeText(getApplicationContext(), " Press Back again to Exit ", Toast.LENGTH_SHORT).show();

    if (backpress>1) {
        this.finish();
    }
}

5
बदलें this.finish()के साथ super.onBackPressed();।
— फ्रेड

5
इसके बजाय पिछली स्क्रीन / गतिविधि पर वापस जाने के लिए this.finish()कॉल करेंNavUtils.navigateUpFromSameTask(this);
— To Kra

जवाबों:


213

मैं उपयोगकर्ता से पूछते हुए एक संवाद लागू करूंगा कि क्या वे बाहर निकलना चाहते हैं और super.onBackPressed()यदि वे करते हैं तो कॉल करें ।

@Override
public void onBackPressed() {
    new AlertDialog.Builder(this)
        .setTitle("Really Exit?")
        .setMessage("Are you sure you want to exit?")
        .setNegativeButton(android.R.string.no, null)
        .setPositiveButton(android.R.string.yes, new OnClickListener() {

            public void onClick(DialogInterface arg0, int arg1) {
                WelcomeActivity.super.onBackPressed();
            }
        }).create().show();
}

उपरोक्त उदाहरण में, आपको अपनी गतिविधि के नाम के साथ WelcomeActivity को बदलना होगा।


यह काम करता है, लेकिन मेरे मामले में पॉपअप केवल कुछ मिली सेकेंड के लिए दिखाया गया है और गायब होने के बाद और नई विंडो दिखाया गया है। मेरे पास हाँ या नहीं क्लिक करने का समय नहीं है, और यदि मैं इसे डीबग करता हूं, तो यह ऑनक्लिक विधि के लिए पास नहीं होता है। क्यों?
— 14

4
@Accollativo, आपको लगता है कि अभी भी super.onBackPressed()आपकी onBackPressed()परिभाषा में एक कॉल है (ऑनकिक विधि के अंदर एक के अलावा)?
— स्टीव प्रेंटिस

6
मैंने देखा है हर ऐप "दूसरा बैक प्रेस" विधि का पक्षधर है। यदि कोई डायलॉग दिखाता है तो गलती से पीछे की कुंजी मारने वाला उपयोगकर्ता नाराज हो जाएगा। टोस्ट कम घुसपैठ है।
— कार्मिक कोडर

@ सेवेंट अप्रेंटिस मैं अपने आवेदन में उस स्निपेट का उपयोग करता हूं, लेकिन क्या होगा अगर हमारे पास एक प्रक्रिया चल रही है जबकि हम अपनी गतिविधि का समर्थन कर रहे हैं - प्रक्रिया अभी भी चल रही है। उसे कैसे ठीक करें? अगर मैं उपयोग करता हूं, android.os.Process.killProcess(android.os.Process.myPid());लेकिन गतिविधियों के बीच एनीमेशन इतना आसान नहीं है। इसके बजाय, यह दूसरी के लगभग आधे हिस्से के लिए एक काली स्क्रीन को फ्लैश कर रहा है।
— स्टैनिमिर याकिमोव

1
@Stanimir Yakimov, पृष्ठभूमि प्रक्रियाओं को चलाने के लिए एंड्रॉइड की सेवाओं को देखें। यह आपके जीवन चक्र प्रबंधन को आसान बना देगा। यदि आप अभी भी इसका पता लगाने में असमर्थ हैं, तो मैं एक नया प्रश्न बनाने का सुझाव दूंगा।
— स्टीव प्रेंटिस

19

आपको बैक प्रेस के लिए काउंटर की आवश्यकता नहीं है।

बस एक टोस्ट जो दिखाया गया है:

private Toast backtoast;

फिर,

public void onBackPressed() {
    if(USER_IS_GOING_TO_EXIT) {
        if(backtoast!=null&&backtoast.getView().getWindowToken()!=null) {
            finish();
        } else {
            backtoast = Toast.makeText(this, "Press back to exit", Toast.LENGTH_SHORT);
            backtoast.show();
        }
    } else {
        //other stuff...
        super.onBackPressed();
    }
}

finish()यदि आप अभी भी टोस्ट दिखाई दे रहे हैं, तो यह कॉल करेगा और यदि बैक प्रेस के परिणामस्वरूप एप्लिकेशन से बाहर निकलना होगा।


इसके बजाय पिछली स्क्रीन / गतिविधि पर वापस जाने के लिए this.finish()कॉल करेंNavUtils.navigateUpFromSameTask(this);
— To Kra

यहाँ पर विचार करने के लिए एक वैकल्पिक उत्तर । मैंने अभी तक तय नहीं किया है कि मुझे कौन सा दृष्टिकोण पसंद है। लिंक किए गए उत्तर का कुछ विवरण इसमें जोड़ा जा सकता है, विशेष रूप से उपयोगकर्ता के बाहर निकलते ही टोस्ट को रद्द करने का तर्क।
— टूलमेकरसैट

14

मैं इस बहुत सरल दृष्टिकोण का उपयोग करें ...

public class XYZ extends Activity {
    private long backPressedTime = 0;    // used by onBackPressed()


    @Override
    public void onBackPressed() {        // to prevent irritating accidental logouts
        long t = System.currentTimeMillis();
        if (t - backPressedTime > 2000) {    // 2 secs
            backPressedTime = t;
            Toast.makeText(this, "Press back again to logout",
                                Toast.LENGTH_SHORT).show();
        } else {    // this guy is serious
            // clean up
            super.onBackPressed();       // bye
        }
    }
}

सैमसंग नोट टैबलेट पर कुछ अजीब होता है। कई बार तेजी से वापस हिट करने की आवश्यकता है। यह 'backToast' के दृष्टिकोण को पसंद नहीं करता है ...
— SoloPilot

क्या यह नोट पर बेहतर काम करता है यदि आप बाहर निकलने से पहले टोस्ट को रद्द करते हैं? देखें इस
— ToolmakerSteve

2

आकस्मिक रास्ते से बचने के लिए आपके रास्ते और @ स्टीव का रास्ता दोनों स्वीकार्य तरीके हैं।

यदि आपके कार्यान्वयन को जारी रखने के लिए चयन करना है, तो आपको एक Timerनिश्चित अवधि के बाद, इसे वापस 0 पर आरम्भ करने के लिए सुनिश्चित करना होगा, और संभवतः इसे किसी प्रकार से 0 पर वापस सेट करने के लिए लागू करना होगा । (~ 5 सेकंड सही लगता है)


2

onPauseपहले बैक प्रेस के बाद, जब उपयोगकर्ता घर पर प्रेस करते हैं या किसी अन्य माध्यम से दूर जाते हैं, तो उन मामलों को रोकने के लिए आपको काउंटर रीसेट करना पड़ सकता है । अन्यथा, मुझे कोई समस्या दिखाई नहीं देती है।


1

अगर आप फर्स्ट एक्टिविटी में जाए बिना डायरेक्ट सेकेंड एक्टिविटी से अपने आवेदन से बाहर निकलना चाहते हैं तो इस कोड को आज़माएं..`

सेकंड एक्टिविटी में इस कोड को डालें ।।

 @Override
public void onBackPressed() {
    new AlertDialog.Builder(this)
            .setTitle("Really Exit?")
            .setMessage("Are you sure you want to exit?")
            .setNegativeButton(android.R.string.no, null)
            .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface arg0, int arg1) {
                    setResult(RESULT_OK, new Intent().putExtra("EXIT", true));
                    finish();
                }

            }).create().show();
}

और आपकी पहली गतिविधि इस कोड को .....

public class FirstActivity extends AppCompatActivity {

Button next;
private final static int EXIT_CODE = 100;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    next = (Button) findViewById(R.id.next);
    next.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {

            startActivityForResult(new Intent(FirstActivity.this, SecondActivity.class), EXIT_CODE);
        }
    });
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == EXIT_CODE) {
        if (resultCode == RESULT_OK) {
            if (data.getBooleanExtra("EXIT", true)) {
                finish();
            }
        }
    }
}

}


1

यह सबसे अच्छा तरीका है, क्योंकि यदि उपयोगकर्ता दो सेकंड से अधिक वापस नहीं आता है, तो बैकप्रेस्ड वैल्यू को रीसेट करें।

एक वैश्विक चर घोषित करें।

 private boolean backPressToExit = false;

ओवरराइड onBackPressedविधि।

@Override
public void onBackPressed() {

    if (backPressToExit) {
        super.onBackPressed();
        return;
    }
    this.backPressToExit = true;
    Snackbar.make(findViewById(R.id.yourview), getString(R.string.exit_msg), Snackbar.LENGTH_SHORT).show();
    new Handler().postDelayed(new Runnable() {

        @Override
        public void run() {
            backPressToExit = false;
        }
    }, 2000);
}

निजी बूलियन backPressToExit = झूठ के रूप में एक चर घोषित
— योगेश राठी

1) कृपया टिप्पणी में कहने के बजाय आपके द्वारा उल्लिखित बूलियन को शामिल करने के लिए अपने उत्तर को संपादित करें। इसलिए लोग देख सकते हैं कि घोषणा कहां होनी चाहिए। 2) वास्तव में यह समय के बारे में जागरूक होने का एक वैकल्पिक तरीका है। कृपया समझाएं कि आप इसे "सर्वश्रेष्ठ" क्यों मानते हैं। विशेष रूप से, यह एक हैंडलर बनाने का ओवरहेड है - ऐसा करने से क्या प्राप्त होता है?
— टूलमेकरसैट

0

इसके अतिरिक्त, आपको कॉल करने से पहले संवाद को भंग करना activity.super.onBackPressed()होगा, अन्यथा आपको "गतिविधि लीक हो गई है .." त्रुटि हो जाएगी।

Sweetalerdialog पुस्तकालय के साथ मेरे मामले में उदाहरण:

 @Override
    public void onBackPressed() {
        //super.onBackPressed();
        SweetAlertDialog progressDialog = new SweetAlertDialog(this, SweetAlertDialog.WARNING_TYPE);
        progressDialog.setCancelable(false);
        progressDialog.setTitleText("Are you sure you want to exit?");
        progressDialog.setCancelText("No");
        progressDialog.setConfirmText("Yes");
        progressDialog.setCanceledOnTouchOutside(true);
        progressDialog.setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
            @Override
            public void onClick(SweetAlertDialog sweetAlertDialog) {
                sweetAlertDialog.dismiss();
                MainActivity.super.onBackPressed();
            }
        });
        progressDialog.show();
    }

0

गतिविधि निर्दिष्ट करने के लिए .onBackPressed () का उपयोग करें

@Override
public void onBackPressed(){
    backpress = (backpress + 1);
    Toast.makeText(getApplicationContext(), " Press Back again to Exit ", Toast.LENGTH_SHORT).show();

    if (backpress>1) {
        this.finish();
    }
}

1
कृपया बताएं कि आपने मूल कोड में क्या जोड़ा है, और क्यों।
— टूलमेकरसैट

0

मेरे पास बस यह मुद्दा था और इसे निम्न विधि से जोड़कर हल किया गया था:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
             // click on 'up' button in the action bar, handle it here
             return true;

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

0

आप अनुकूलित टोस्ट का उपयोग करके निम्नलिखित तरीके से onBackPressed का उपयोग कर सकते हैं:

यहां छवि विवरण दर्ज करें

customized_toast.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/txtMessage"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:drawableStart="@drawable/ic_white_exit_small"
    android:drawableLeft="@drawable/ic_white_exit_small"
    android:drawablePadding="8dp"
    android:paddingTop="8dp"
    android:paddingBottom="8dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:gravity="center"
    android:textColor="@android:color/white"
    android:textSize="16sp"
    android:text="Press BACK again to exit.."
    android:background="@drawable/curve_edittext"/>

MainActivity.java

@Override
public void onBackPressed() {

    if (doubleBackToExitPressedOnce) {
        android.os.Process.killProcess(Process.myPid());
        System.exit(1);
        return;
    }

    this.doubleBackToExitPressedOnce = true;
    Toast toast = new Toast(Dashboard.this);
    View view = getLayoutInflater().inflate(R.layout.toast_view,null);
    toast.setView(view);
    toast.setDuration(Toast.LENGTH_SHORT);
    int margin = getResources().getDimensionPixelSize(R.dimen.toast_vertical_margin);
    toast.setGravity(Gravity.BOTTOM | Gravity.CENTER_VERTICAL, 0, margin);
    toast.show();

    new Handler().postDelayed(new Runnable() {

        @Override
        public void run() {
            doubleBackToExitPressedOnce=false;
        }
    }, 2000);
}

0

यह प्रयोग करें, यह मदद कर सकता है।

@Override
public void onBackPressed() {
    new AlertDialog.Builder(this)
            .setTitle("Message")
            .setMessage("Do you want to exit app?")
            .setNegativeButton("NO", null)
            .setPositiveButton("YES", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    UserLogin.super.onBackPressed();
                }
            }).create().show();
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.