簡體   English   中英

如何在 OnBackPressed 上顯示自定義對話框

[英]How to Show Custom Dialog on OnBackPressed

每當有人單擊主 Activity 上的后退按鈕以退出應用程序時,我想顯示一個自定義對話框。

我嘗試了多種方法,但對我不起作用。 我只想在該對話框中有 4 個圖標(按鈕)和一個文本行以及“退出”應用程序選項。

你們有什么可行的解決方案可以建議嗎?

要在用戶單擊后退按鈕時執行操作,您可以簡單地覆蓋onBackPressed() ,以顯示您需要做兩件事的自定義對話框,首先使用 4 個按鈕和您想要的文本創建對話框的布局。

custom_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="80dp"
    android:background="#3E80B4"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/txt_dia"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="10dp"
        android:text="Your text goes here"
        android:textColor="@android:color/white"
        android:textSize="15dp"
        android:textStyle="bold"/>


    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:background="#3E80B4"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/btn_yes"
            android:layout_width="100dp"
            android:layout_height="30dp"
            android:background="@android:color/white"
            android:clickable="true"
            android:text="Yes"
            android:textColor="#5DBCD2"
            android:textStyle="bold" />

        <Button
            android:id="@+id/btn_no"
            android:layout_width="100dp"
            android:layout_height="30dp"
            android:layout_marginLeft="5dp"
            android:background="@android:color/white"
            android:clickable="true"
            android:text="No"
            android:textColor="#5DBCD2"
            android:textStyle="bold" />

        <Button
            android:id="@+id/btn_exit"
            android:layout_width="100dp"
            android:layout_height="30dp"
            android:layout_marginLeft="5dp"
            android:background="@android:color/white"
            android:clickable="true"
            android:text="Exit"
            android:textColor="#5DBCD2"
            android:textStyle="bold" />
    </LinearLayout>

</LinearLayout>

然后創建自定義對話框 class 擴展Dialog並實現OnClickListener

public class CustomDialogClass extends Dialog implements
        android.view.View.OnClickListener {

    public CustomDialogListener listener;
    public Dialog d;
    public Button yes, no, exit;

    public CustomDialogClass(@NonNull Context context,
                             CustomDialogListener listener) {
        super(context);
        this.listener = listener ;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.custom_dialog);
        yes = (Button) findViewById(R.id.btn_yes);
        no = (Button) findViewById(R.id.btn_no);
        exit = (Button) findViewById(R.id.btn_exit);
        yes.setOnClickListener(this);
        no.setOnClickListener(this);
        exit.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_yes:
                listener.onYesButtonClicked();
                break;
            case R.id.btn_no:
                listener.onNoButtonClicked();
                break;
            case R.id.btn_exit:
                listener.onExitButtonClicked();
                break;
            default:
                break;
        }
        dismiss();
    }

    public interface CustomDialogListener {
        public void onYesButtonClicked() ;
        public void onNoButtonClicked() ;
        public void onExitButtonClicked() ;
    }

}

最后在 MainActivity class 上覆蓋onBackPressed() ,顯示對話框並處理所有按鈕點擊

    @Override
    public void onBackPressed() {
        CustomDialogClass cd = new CustomDialogClass(this, new CustomDialogClass.CustomDialogListener() {
            @Override
            public void onYesButtonClicked() {
                Toast.makeText(MainActivity.this, "Yes Clicked", Toast.LENGTH_LONG).show();
            }

            @Override
            public void onNoButtonClicked() {
                Toast.makeText(MainActivity.this, "No Clicked", Toast.LENGTH_LONG).show();
            }

            @Override
            public void onExitButtonClicked() {
                Toast.makeText(MainActivity.this, "Exit Clicked", Toast.LENGTH_LONG).show();
            }
        });
        cd.show();
    }

嘗試覆蓋您的主要活動onBackPressed() function。 如果用戶按下后退按鈕,它將被觸發。 然后您可以彈出您的自定義對話框,如果在您的對話框上單擊退出按鈕,您可以調用super.onBackPressed()finish() 這將關閉您的應用程序。

更新

class MainActivity : AppCompatActivity() {

    private var dialog: Dialog? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    override fun onBackPressed() {

        if (dialog == null || dialog?.isShowing == false) {

            dialog = AlertDialog.Builder(this)
                .setTitle("Some title")
                .setMessage("Some message")
                .setPositiveButton("Exit") { dialog, which ->
                    super.onBackPressed()
                }
                .setNeutralButton("Action 1") { dialog, which ->
                    //DO SOME ACTION
                    dialog.cancel()
                }
                .setNegativeButton("Action 2") { dialog, which ->
                    //DO SOME ACTION
                    dialog.cancel()
                }
                .create()

            dialog!!.show()
        }
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM