অ্যান্ড্রয়েড: টোস্ট সহ অনব্যাকপ্রেসড () ব্যবহারের উপযুক্ত উপায়


85

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

কোড:

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

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

4
this.finish()সঙ্গে প্রতিস্থাপন super.onBackPressed();
ফ্রেড

4
পরিবর্তে পূর্ববর্তী স্ক্রিন / ক্রিয়াকলাপ ফিরে পেতে this.finish()কল করুনNavUtils.navigateUpFromSameTask(this);
ক্রা

উত্তর:


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();
}

উপরের উদাহরণে, আপনাকে আপনার ক্রিয়াকলাপের নাম দিয়ে ওয়েলকামঅ্যাক্টিভিটি প্রতিস্থাপন করতে হবে।


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

4
@ আকোল্লাটিভো, super.onBackPressed()আপনার onBackPressed()সংজ্ঞাটিতে এখনও কি কল আছে বলে মনে হচ্ছে (অনক্লিক পদ্ধতির অভ্যন্তর বাদে )?
স্টিভ প্রেন্টাইস

6
আমি দেখেছি এমন প্রতিটি অ্যাপ্লিকেশন "সেকেন্ড ব্যাক প্রেস" পদ্ধতির পক্ষপাতী। কোনও ব্যবহারকারী দুর্ঘটনাক্রমে পিছনের কীটি চাপুন যদি কোনও ডায়ালগ প্রদর্শিত হয় তবে বিরক্ত হবে। টোস্টটি কম অনুপ্রবেশকারী।
কার্মিক কোডার

@ স্টিভ প্রেন্টাইস আমি আমার অ্যাপ্লিকেশনটিতে সেই স্নিপেট ব্যবহার করি তবে কীভাবে আমরা আমাদের ক্রিয়াকলাপের পিছনে থাকাকালীন চলমান প্রক্রিয়া থাকলে - প্রক্রিয়াটি এখনও চলছে। কীভাবে ঠিক করব? যদি আমি ব্যবহার করি android.os.Process.killProcess(android.os.Process.myPid());তবে ক্রিয়াকলাপগুলির মধ্যে অ্যানিমেশনটি এত মসৃণ নয়। এর পরিবর্তে, এটি প্রায় অর্ধেকের জন্য একটি কালো পর্দা ফ্ল্যাশ করছে flash
স্টানিমির ইয়াকিমভ

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

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);
ক্রা

এখানে বিবেচনা করার জন্য একটি বিকল্প উত্তর । আমি কোন পদ্ধতিটি পছন্দ করি তা এখনও ঠিক করি নি। লিঙ্কযুক্ত উত্তরের কিছু বিবরণ এই সাথে যুক্ত করা যেতে পারে, বিশেষত ব্যবহারকারীর প্রস্থানের সাথে সাথেই টোস্টটি বাতিল করার যুক্তিযুক্ত।
টুলমেকারস্টেভ

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
        }
    }
}

স্যামসাং নোট ট্যাবলেটে অদ্ভুত কিছু ঘটে। দ্রুত কয়েকবার পিছনে আঘাত করা প্রয়োজন। এটি 'ব্যাকটোস্ট' পদ্ধতির পছন্দও করে না ...
সোলোপাইলট

আপনি প্রস্থান করার আগে টোস্ট বাতিল করে দিলে এটি কী নোটে আরও ভাল কাজ করে? দেখুন এই
ToolmakerSteve

2

আপনার উপায় এবং @ স্টিভের উভয় পথই দুর্ঘটনাজনিত প্রস্থান রোধ করার গ্রহণযোগ্য উপায়।

যদি আপনার প্রয়োগটি অবিরত করার জন্য বেছে নেওয়া হয় তবে আপনার ব্যাকপ্রেসটি 0 থেকে শুরু করার বিষয়টি নিশ্চিত করতে হবে এবং একটি কোলডাউন পিরিয়ড পরে সম্ভবত কীপ্রেসে Timerএটি 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(), কল করার আগে আপনাকে ডায়লগ ছড়িয়ে দিতে হবে, অন্যথায় আপনি "কার্যকলাপ ফাঁস হয়ে গেছে .." ত্রুটি পাবেন।

আমার ক্ষেত্রে মিষ্টিলেডিয়ালগ লাইব্রেরির উদাহরণ:

 @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();
    }
}

4
আপনি মূল কোডটিতে কী যুক্ত করেছেন এবং কেন তা দয়া করে ব্যাখ্যা করুন।
টুলমেকারস্টেভ

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

আপনি কাস্টমাইজড টোস্ট ব্যবহার করে নিম্নলিখিত পদ্ধতিগুলিতে অনব্যাকপ্রেসড ব্যবহার করতে পারেন:

এখানে চিত্র বর্ণনা লিখুন

কাস্টমাইজড_ টোস্ট.এক্সএমএল

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

মেইনএ্যাকটিভিটি.জভা

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