如何在Dialog(Android)中实现onWindowFocusChange()方法

时间:2015-05-04 12:35:51

标签: android inheritance android-alertdialog android-dialog

我需要使用方法onWindowFocusChange()关闭AlertDialog中的系统对话框,因此我决定扩展AlertDialog并实现该方法。

public class MyAlertDialog extends AlertDialog {    
    private Context context;

    protected MyAlertDialog(Context context) {
       super(context);
       this.context = context;
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
       super.onWindowFocusChanged(hasFocus);

        if (!hasFocus) {
            Intent closeDialogs = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
            context.sendBroadcast(closeDialogs);
        }
    }
}

当我从create()致电show()AlertDialog.Builder时,这些方法会返回AlertDialog但不会返回MyAlertDialog个对象和onWindowsFocusChanged()没有执行。显然我无法将AlertDialog投射到MyAlertDialog

 AlertDialog dialog = new MyAlertDialog(this);

 MyAlertDialog.Builder builder = new MyAlertDialog.Builder(this);
 builder.setMessage(...);
 builder.setCancelable(false);
 builder.setNeutralButton(...)
 builder.show(); // Returns AlertDialog
 // dialog = builder.show(); -> dialog doesn't execute onWindowsFocusChanged()
 // dialog = (MyAlertDialog) builder.show() -> Not allowed (ClassCastException)

那么,当MyAlertDialog显示时,如何创建并显示Dialog或其他方式来关闭系统对话框?我找了信息,但我找不到任何东西。

提前致谢。

2 个答案:

答案 0 :(得分:1)

要使用onWindowFocusChanged,你必须在xml中创建一个带有2个按钮的Dialog布局,创建一个Dialog类并扩展Dialog,并用它设置Dialog的内容视图。

xml Dialog(myDialog.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@android:color/white"
    android:orientation="vertical">

    <TextView
        android:layout_width="280dp"
        android:layout_height="50dp"
        android:layout_marginBottom="20dp"
        android:layout_marginLeft="24dp"
        android:layout_marginRight="24dp"
        android:layout_marginTop="24dp"
        android:text="Title"
        android:textColor="@color/black"
        android:textSize="22sp" />

    <EditText
        android:id="@+id/password"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:layout_marginBottom="24dp"
        android:layout_marginLeft="24dp"
        android:layout_marginRight="24dp"
        android:hint="Password"
        android:inputType="textPassword"
        android:textSize="22sp" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="52dp"
        android:gravity="end">

        <Button
            android:id="@+id/btn_no"
            android:layout_width="wrap_content"
            android:layout_height="36dp"
            android:layout_marginBottom="8dp"
            android:layout_marginRight="8dp"
            android:layout_marginTop="8dp"
            android:background="@android:color/white"
            android:clickable="true"
            android:gravity="center"
            android:maxWidth="128dp"
            android:text="Cancel"
            android:textColor="#5DBCD2"
            android:textStyle="bold" />

        <Button
            android:id="@+id/btn_yes"
            android:layout_width="wrap_content"
            android:layout_height="36dp"
            android:layout_marginBottom="8dp"
            android:layout_marginRight="8dp"
            android:layout_marginTop="8dp"
            android:background="@android:color/white"
            android:clickable="true"
            android:gravity="center"
            android:maxWidth="128dp"
            android:text="Login"
            android:textColor="#5DBCD2"
            android:textStyle="bold" />

    </LinearLayout>
</LinearLayout>

对话类:

public class MyDialog extends Dialog {
    private Context context;

    public F50Dialog(Context context) {
        super(context);
        this.context = context;
        requestWindowFeature(Window.FEATURE_NO_TITLE);
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (!hasFocus) {
            Intent closeDialogs = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
            sendBroadcast(closeDialogs);
        }
    }
}

在活动中创建对话框:

private void myDialog() {

        LayoutInflater li = LayoutInflater.from(this);
        View promptsView = li.inflate(R.layout.myDialog, null, false);

        final MyDialog alert = new MyDialog(this);
        final EditText input = (EditText) promptsView.findViewById(R.id.password);

        spin.setAdapter(mOperatorsAryAdapter);

        alert.setContentView(promptsView);
        alert.setCancelable(false);
        alert.setTitle("Password Required");
        alert.findViewById(R.id.btn_no).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                alert.dismiss();
            }
        });
        alert.findViewById(R.id.btn_yes).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (???) {
                    alert.dismiss();
                } else {

                }
            }
        });
        alert.show();
    }

现在onWindowFocusChanged将会激活!

答案 1 :(得分:0)

尝试移动覆盖方法:

@Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (!hasFocus) {
            Intent closeDialogs = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
            sendBroadcast(closeDialogs);
        }
    }

对活动本身。

并使用 AlertDialog 类。每当出现系统对话框时,它将通过调用活动内部发生的方法关闭,无需从AlertDialog类继承。