ব্যবহারকারী কোনও Android ক্রিয়াকলাপ থেকে প্রস্থান করতে চান তা নিশ্চিত করতে ডায়ালগটি কীভাবে দেখানো যায়?


274

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

তবে আমি যথাযথ এপিআই হুক খুঁজে পাই না। Activity.onUserLeaveHint()প্রথমদিকে আশাব্যঞ্জক লাগছিল, তবে ক্রিয়াকলাপ শেষ হওয়া থেকে থামানোর কোনও উপায় আমি খুঁজে পাচ্ছি না।


39
আপনার কি এই প্রম্পট থাকা একেবারেই প্রয়োজনীয়? যখন কোনও ব্যবহারকারী কোনও ক্রিয়াকলাপ শেষ করতে চান, তাদের তাৎক্ষণিকভাবে তা করতে সক্ষম হওয়া উচিত। আপনি আপনার কৌশলটি পুনর্বিবেচনা করতে চাইতে পারেন।
টম আর

4
স্যামসাংয়ের অ্যাপ স্টোরটিতে তালিকাভুক্তির জন্য প্রস্থান নিশ্চিতকরণ বিকল্প প্রদর্শন করা বাধ্যতামূলক। আমার অ্যাপ্লিকেশনগুলির একটি এটি না থাকার কারণে প্রত্যাখ্যান করা হয়েছিল।
জন আশমোর

6
এটি অশুভ, @ স্যামসং।
dokkaebi

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

15
@ টম আর: সম্পূর্ণরূপে একমত নন। এমন কোনও অ্যাপ রয়েছে যা আপনি দুর্ঘটনাক্রমে শেষ করতে চান না। তারা ব্যবসায়ের পরিবেশে কাজ করে ইত্যাদি।
TomeeNS

উত্তর:


390

অ্যানড্রয়েড ২.০+ তে এটি দেখতে পাবেন:

@Override
public void onBackPressed() {
    new AlertDialog.Builder(this)
        .setIcon(android.R.drawable.ic_dialog_alert)
        .setTitle("Closing Activity")
        .setMessage("Are you sure you want to close this activity?")
        .setPositiveButton("Yes", new DialogInterface.OnClickListener()
    {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            finish();    
        }

    })
    .setNegativeButton("No", null)
    .show();
}

পূর্ববর্তী সংস্করণগুলিতে এটির মতো দেখাবে:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    //Handle the back button
    if(keyCode == KeyEvent.KEYCODE_BACK) {
        //Ask the user if they want to quit
        new AlertDialog.Builder(this)
        .setIcon(android.R.drawable.ic_dialog_alert)
        .setTitle(R.string.quit)
        .setMessage(R.string.really_quit)
        .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {

                //Stop the activity
                YourClass.this.finish();    
            }

        })
        .setNegativeButton(R.string.no, null)
        .show();

        return true;
    }
    else {
        return super.onKeyDown(keyCode, event);
    }

}

15
২.০ এবং তারপরে একটি নতুন অনব্যাকপ্রেসড ইভেন্ট রয়েছে যা onKeyDown developer.android.com/intl/zh-TW/references/android/app/… এর উপরে প্রস্তাবিত রয়েছে এখানে একটি বিভাগ রয়েছে যা পরিবর্তনগুলি এবং নতুন প্রস্তাবিত পদ্ধতির বিষয়ে কথা বলছে। বিকাশকারী.অ্যান্ড্রয়েড.
প্যাট্রিক কাফকা

3
এখানে পিছনের কীটি ধরার বিষয়ে ব্লগ পোস্ট: Android-developers.blogspot.com/2009/12/… নোট করুন যে এটি আপনাকে ব্যবহারকারীকে যে অ্যাপ্লিকেশনটি ছেড়ে দিতে পারে তার অন্যান্য উপায় ধরতে দেয় না: বাড়িতে চাপছে, একটি বিজ্ঞপ্তি নির্বাচন করছে, একটি ফোন গ্রহণ করবে কল, ইত্যাদি
hackbod

এটি নিখুঁতভাবে কাজ করে তবে ব্যবহারকারীর দেখানোর সময় আপনি কীভাবে কোড এক্সিকিউশনটি বন্ধ করতে বাধ্য করেন?
anon58192932

দেখা গেল, এই এখানে একটি মহান সমাধান: stackoverflow.com/questions/4381296/...
anon58192932

1
এটি সেই পদ্ধতি () যা আমি সন্ধান করছি তবে এই পদ্ধতিটি কোথায় () বলা হবে তা আমি জানতাম না।
ব্যবহারকারী 2841300

186
@Override
public void onBackPressed() {
    new AlertDialog.Builder(this)
           .setMessage("Are you sure you want to exit?")
           .setCancelable(false)
           .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   ExampleActivity.super.onBackPressed();
               }
           })
           .setNegativeButton("No", null)
           .show();
}

5
এলব্রেডফোর্ড একটি মন্তব্য করেছেন: সুপারব্যাকপ্রেসডকে কল করা অনব্যাকপ্রেসডকে কেবল ফিনিস () বলে কল্পনা করার চেয়ে ভাল। এমনকি যদি এটি এখন সত্য হয় তবে ভবিষ্যতের এপিআইগুলিতে এটি সত্য নাও হতে পারেCustomTabActivity.super.onBackPressed
mplungjan

@ এমপ্লুঞ্জন আপনি কি নিজের মন্তব্যটি স্পষ্ট করতে পারবেন ... আপনি কি finish()কোডটি প্রতিস্থাপন করা ভাল বলে বলছেন super.onBackPressed()?
নিষিদ্ধ-জিওঞ্জিনিয়ারিং

মন্তব্যটি 3 বছরের পুরানো। 2015 সালে ভাল অনুশীলন কী তা আমার কোনও ধারণা নেই
mplungjan

@ এমপ্লুঞ্জন আপনার মন্তব্য ভবিষ্যতের এপিআইগুলিকে রেফারেন্স করেছে, তবে আপনি যদি যাইহোক স্পষ্ট করতে পারতেন তবে এটি সহায়ক হবে।
নিষিদ্ধ-জিওঞ্জিনিয়ারিং

কোন প্রব। ঠিক আছে, আমি চেষ্টা করেছি MyActivity.super.onBackPressed();এবং এটি আমার পক্ষে ভাল কাজ করে। এটি বেশিরভাগ যৌক্তিক পদ্ধতির কাছেও মনে হয় - যখন আপনি "নং" ব্যবহারকারীর সাথে ট্যাপ করেন তবে আপনি যে পদ্ধতিটিকে ওভাররাইড করছেন সেটি কল করার জন্য you
নিষিদ্ধ-জিওইনজিনিয়ারিং

33

@ ব্যবহারকারী919216 কোডটি পরিবর্তন করেছেন .. এবং এটি ওয়েবউউয়ের সাথে সামঞ্জস্যপূর্ণ করেছেন

@Override
public void onBackPressed() {
    if (webview.canGoBack()) {
        webview.goBack();

    }
    else
    {
     AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure you want to exit?")
       .setCancelable(false)
       .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                finish();
           }
       })
       .setNegativeButton("No", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
           }
       });
AlertDialog alert = builder.create();
alert.show();
    }

}

22

আমি প্রস্থান ডায়ালগের চেয়ে ব্যাক বোতামে ডাবল ট্যাপ দিয়ে প্রস্থান করতে পছন্দ করব।

এই সমাধানে, এটি প্রথমবারের মতো ফিরে যাওয়ার সময় একটি টোস্ট দেখায়, সতর্ক করে যে আর কোনও পিছনের প্রেস অ্যাপটি বন্ধ করে দেবে। এই উদাহরণে 4 সেকেন্ডেরও কম।

private Toast toast;
private long lastBackPressTime = 0;

@Override
public void onBackPressed() {
  if (this.lastBackPressTime < System.currentTimeMillis() - 4000) {
    toast = Toast.makeText(this, "Press back again to close this app", 4000);
    toast.show();
    this.lastBackPressTime = System.currentTimeMillis();
  } else {
    if (toast != null) {
    toast.cancel();
  }
  super.onBackPressed();
 }
}

টোকন থেকে: http://www.androiduipatterns.com/2011/03/back-button-behaviour.html


ডায়ালগবক্স জটিল হতে পারে বলে এটি অবশ্যই আমার প্রিয়। আমি এটি 3 সেকেন্ডে তৈরি করতে কিছুটা পরিবর্তন করেছি এবং এটি চিহ্নিতকারীটির সাথে আরও কিছুটা প্রাকৃতিক বলে মনে হচ্ছে। পোস্টের জন্য ধন্যবাদ.
PGMacDesign

ডাবল ব্যাক প্রেসে আদর্শ অ্যাপ্লিকেশনটি আমার প্রস্থান করা উচিত তবে আমার কোডে এটি একটি লগইন ক্রিয়াকলাপ খোলার অর্থ (সক্ষম স্পিনারের সাথে ব্যাক ক্রিয়াকলাপ)
টেকডিজি

21

আপনি যদি নিশ্চিত না হন যে "পিছনে" কলটি অ্যাপটি প্রস্থান করবে, বা ব্যবহারকারীকে অন্য ক্রিয়াকলাপে নিয়ে যাবে, আপনি উপরের উত্তরগুলি একটি চেক, মোড়কে টাস্করুট () এ মোড়াতে পারেন। এটি ঘটতে পারে যদি আপনার মূল ক্রিয়াকলাপটি একাধিক বার ব্যাক স্ট্যাকে যুক্ত করা যায়, বা আপনি যদি আপনার পিছনের স্ট্যাকের ইতিহাসটি চালাচ্ছেন।

if(isTaskRoot()) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Are you sure you want to exit?")
       .setCancelable(false)
       .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                YourActivity.super.onBackPressed;
           }
       })
       .setNegativeButton("No", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
           }
       });
    AlertDialog alert = builder.create();
    alert.show();

} else {
    super.onBackPressed();
}

5

ল্যাম্বদা ব্যবহার:

    new AlertDialog.Builder(this).setMessage(getString(R.string.exit_msg))
        .setTitle(getString(R.string.info))
        .setPositiveButton(getString(R.string.yes), (arg0, arg1) -> {
            moveTaskToBack(true);
            finish();
        })
        .setNegativeButton(getString(R.string.no), (arg0, arg1) -> {
        })
        .show();

আপনার গ্রেডল বিল্ডে জাভা 8 সমর্থন করার জন্য আপনাকে স্তর স্তর সেটও করতে হবে:

compileOptions {
       targetCompatibility 1.8
       sourceCompatibility 1.8
}

5

চীনে, বেশিরভাগ অ্যাপ্লিকেশন "দুইবার ক্লিক করুন" দ্বারা প্রস্থানটি নিশ্চিত করবে:

boolean doubleBackToExitPressedOnce = false;

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

    this.doubleBackToExitPressedOnce = true;
    Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();

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

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

5

কোডের চেয়ে নীচে এবং পদ্ধতি super.onBackPressed();থেকে প্রথমে সরান onbackPressed():

@Override
public void onBackPressed() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Are you sure you want to exit?")
           .setCancelable(false)
           .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                    MyActivity.this.finish();
               }
           })
           .setNegativeButton("No", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
               }
           });
    AlertDialog alert = builder.create();
    alert.show();

}

2

আমি একটি @GLee পদ্ধতির পছন্দ করি এবং নীচের মত টুকরা দিয়ে এটি ব্যবহার করি।

@Override
public void onBackPressed() {
    if(isTaskRoot()) {
        new ExitDialogFragment().show(getSupportFragmentManager(), null);
    } else {
        super.onBackPressed();
    }
}

খণ্ড ব্যবহার করে সংলাপ:

public class ExitDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
            .setTitle(R.string.exit_question)
            .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    getActivity().finish();
                }
            })
            .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    getDialog().cancel();
                }
            })
            .create();
    }
}

2
Just put this code in your first activity 

@Override
    public void onBackPressed() {
        if (drawerLayout.isDrawerOpen(GravityCompat.END)) {
            drawerLayout.closeDrawer(GravityCompat.END);
        }
        else {
// if your using fragment then you can do this way
            int fragments = getSupportFragmentManager().getBackStackEntryCount();
            if (fragments == 1) {
new AlertDialog.Builder(this)
           .setMessage("Are you sure you want to exit?")
           .setCancelable(false)
           .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                    finish();
               }
           })
           .setNegativeButton("No", null)
           .show();


            } else {
                if (getFragmentManager().getBackStackEntryCount() > 1) {
                    getFragmentManager().popBackStack();
                } else {

           super.onBackPressed();
                }
            }
        }
    }

y প্রথম ক্রিয়াকলাপ, আমি এটিকে ক্রিয়াকলাপের মাঝখানে রেখেছি। কারণ এখন এটি বর্তমান ক্রিয়াকলাপ বন্ধ করে এবং এটি পূর্ববর্তীটি দেখায়
শরীফ

1

আরেকটি বিকল্প হবে একটি শো Toast/ Snackbarপ্রথম ফিরে প্রেস থেকে প্রস্থান করার জন্য ফিরে আবার টিপুন জিজ্ঞাসা , যা অনেক কম একটি দেখাচ্ছে চেয়ে অনধিকারমূলক হয় AlertDialogব্যবহারকারী অ্যাপ্লিকেশন থেকে প্রস্থান করার জন্য চায় নিশ্চিত করতে হবে।

আপনি DoubleBackPress Android Libraryকয়েকটি লাইন কোডের সাথে এটি অর্জন করতে ব্যবহার করতে পারেন । অনুরূপ আচরণ দেখাচ্ছে জিআইএফ উদাহরণ।

শুরুতে, আপনার আবেদনের উপর নির্ভরতা যুক্ত করুন:

dependencies {
    implementation 'com.github.kaushikthedeveloper:double-back-press:0.0.1'
}

এর পরে, আপনার ক্রিয়াকলাপে প্রয়োজনীয় আচরণটি প্রয়োগ করুন।

// set the Toast to be shown on FirstBackPress (ToastDisplay - builtin template)
// can be replaced by custom action (new FirstBackPressAction{...})
FirstBackPressAction firstBackPressAction = new ToastDisplay().standard(this);

// set the Action on DoubleBackPress
DoubleBackPressAction doubleBackPressAction = new DoubleBackPressAction() {
    @Override
    public void actionCall() {
        // TODO : Exit the application
        finish();
        System.exit(0);
    }
};

// setup DoubleBackPress behaviour : close the current Activity
DoubleBackPress doubleBackPress = new DoubleBackPress()
        .withDoublePressDuration(3000)     // msec - wait for second back press
        .withFirstBackPressAction(firstBackPressAction)
        .withDoubleBackPressAction(doubleBackPressAction);

অবশেষে, ব্যাক প্রেসে এটিকে আচরণ হিসাবে সেট করুন।

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