2015-05-04 2 views
1

Мне нужно использовать метод onWindowFocusChange(), чтобы закрыть диалоговые окна системы в AlertDialog, поэтому я решил расширить AlertDialog и реализовать этот метод.Как реализовать метод onWindowFocusChange() в диалоге (Android)

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 показывает? Я искал информацию, но ничего не нашел.

Заранее спасибо.

ответ

1

Чтобы использовать onWindowFocusChanged, вам необходимо создать раскладку диалога в xml с помощью 2 кнопок, создать класс 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> 

Dialog класс:

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 будет огонь!

+0

Спасибо за ваш ответ! Он отвечает на мой вопрос, и он должен работать. Однако я расскажу вам, как я это решил: когда действие теряет фокус (отображается диалоговое окно, меню с подменю, показанное на панели действий и т. Д.) В методе 'onWindowFocusChanged()' Я запускаю службу с помощью поток, который запускается каждые 300 миллисекунд, чтобы закрыть диалоговые окна системы. Служба (и поток) останавливается, когда активность снова получает фокус в методе 'onWindowFocusChanged(). Таким образом, системные диалоги никогда не отображаются. – jelogar

0

Try переместив переопределен метод:

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

Для самой деятельности.

И используйте AlertDialog класс. Всякий раз, когда появляется системный диалог, он закрывается вызовом метода, который происходит внутри действия, нет необходимости наследовать его из класса AlertDialog.

+0

У меня уже есть 'onWindowsFocusChanged()' внутри действия, но когда 'Dialog' показывает, что он принимает фокус, а активность теряет его. Так что необходимо снова '' onWindowsFocusChanged() '' внутри диалогового окна '' Dialog', чтобы продолжать закрывать системные диалоги во время показа. – jelogar