我需要使用方法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
或其他方式来关闭系统对话框?我找了信息,但我找不到任何东西。
提前致谢。
答案 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类继承。