Android : Toast와 함께 onBackPressed ()를 사용하는 적절한 방법
사용자가 종료하려면 다시 누르라는 메시지를 표시하는 코드를 작성했습니다. 나는 현재 내 코드가 어느 정도 작동하고 있지만 제대로 작성되지 않았 음을 알고 있으며 더 나은 방법이 있다고 가정합니다. 어떤 제안이라도 도움이 될 것입니다!
암호:
public void onBackPressed(){
backpress = (backpress + 1);
Toast.makeText(getApplicationContext(), " Press Back again to Exit ", Toast.LENGTH_SHORT).show();
if (backpress>1) {
this.finish();
}
}
사용자에게 종료를 원하는지 묻는 대화 상자를 구현 한 다음 종료 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를 활동 이름으로 바꿔야합니다.
백 프레스에는 카운터가 필요하지 않습니다.
표시된 토스트에 대한 참조를 저장하십시오.
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()
토스트가 여전히 보이는 상태에서 뒤로를 누르면, 그리고 뒤로 누르면 애플리케이션이 종료되는 경우에만 호출 됩니다.
이보다 훨씬 간단한 접근 방식을 사용합니다.
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
}
}
}
당신의 방식과 @Steve의 방식 모두 우발적 인 종료를 방지하는 허용 가능한 방법입니다.
구현을 계속하기로 선택한 경우 백 프레스가 0으로 초기화되었는지 확인 Timer
하고 쿨 다운 기간 후에 키를 누를 때 0으로 재설정하는 일종의를 구현해야합니다 . (~ 5 초가 맞는 것 같습니다)
또한 onPause
사용자가 처음으로 뒤로 누른 후 집을 누르거나 다른 방법으로 다른 곳으로 이동하는 경우를 방지하기 위해 카운터를 재설정해야 할 수도 있습니다 . 그렇지 않으면 문제가 발생하지 않습니다.
첫 번째 활동으로 이동하지 않고 직접 두 번째 활동에서 애플리케이션을 종료하려면이 코드를 시도하십시오 .`
두 번째 활동에이 코드를 넣으십시오 ..
@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();
}
}
}
}
}
사용자가 2 초 이상 뒤로 돌아 가지 않으면 뒤로 누른 값을 재설정하기 때문에 이것이 가장 좋은 방법입니다.
하나의 전역 변수를 선언하십시오.
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);
}
또한을 호출하기 전에 대화 상자를 dissmis해야합니다 activity.super.onBackPressed()
. 그렇지 않으면 "Activity has leaked .."오류가 발생합니다.
내 경우 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();
}
.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();
}
}
나는 방금이 문제가 있었고 다음 방법을 추가하여 해결했습니다.
@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);
}
}
사용자 정의 된 토스트를 사용하여 다음과 같은 방법으로 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);
}
이것을 사용하면 도움이 될 수 있습니다.
@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();
}
참고 URL : https://stackoverflow.com/questions/6413700/android-proper-way-to-use-onbackpressed-with-toast
'developer tip' 카테고리의 다른 글
Ruby on Rails의 시작 / 홈 페이지-모범 사례 (0) | 2020.10.04 |
---|---|
SQlite 가장 가까운 위치 얻기 (위도와 경도 포함) (0) | 2020.10.04 |
SqlConnectionStringBuilder를 사용하여 연결 문자열에서 데이터베이스 이름을 얻는 방법 (0) | 2020.10.04 |
Android 차트 라이브러리 (0) | 2020.10.04 |
슬래시가 포함 된 변수를 sed에 전달하는 방법 (0) | 2020.10.04 |