2015-07-23 3 views
3

я использую следующий фрагмент кода, чтобы показать пользовательский диалог:AlertDialog не может показать пользовательский макет

btnCancel.setOnClickListener(new View.OnClickListener() 
{ 
    @Override 
    public void onClick(View v) 
    { 
     // 1. Instantiate an AlertDialog.Builder with its constructor 
     AlertDialog.Builder builder = new AlertDialog.Builder(context); 

     // 2. Chain together various setter methods to set the dialog 
     // characteristics 
     builder.setTitle("Question"); 

     AlertDialog dialog= builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() 
     { 

      public void onClick(DialogInterface dialog, int whichButton) 
      { 
       dialog.dismiss(); 
       CallMethod(); 
      } 

     }).setNegativeButton("No", new DialogInterface.OnClickListener() 
     { 
      public void onClick(DialogInterface dialog, int which) 
      { 
       dialog.dismiss(); 
      } 
     }).create(); 
     dialog.setContentView(R.layout.question); 
     dialog.show(); 
    } 
}); 

Когда я нажимаю кнопку, я получаю это исключение:

android.util.AndroidRuntimeException: requestFeature() must be called before adding content 
at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:229) 
at com.android.internal.app.AlertController.installContent(AlertController.java:234) 
at android.app.AlertDialog.onCreate(AlertDialog.java:337) 
at android.app.Dialog.dispatchOnCreate(Dialog.java:355) 
at android.app.Dialog.show(Dialog.java:260) 
at com.example.MyApp.SimpleActivity$2.onClick(SimpleActivity.java:108) 
at android.view.View.performClick(View.java:4207) 
at android.view.View$PerformClick.run(View.java:17372) 
at android.os.Handler.handleCallback(Handler.java:725) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:5041) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
at dalvik.system.NativeStart.main(Native Method) 

Каких запрос нужен ли он?

+1

Отметьте здесь для специального диалогового окна оповещений - androhub.com/android-alert-dialog/ –

ответ

0

Фрагмент кода хорошо, ошибка заключается в следующем: поле контекст был установлен на другой вид деятельности. Я изменил его на следующее, и теперь он работает:

AlertDialog.Builder builder = new AlertDialog.Builder(SimpleActivity.this); 

Ваши намеки приветствуются.

1

Перед созданием диалогового окна вам необходимо установить пользовательский вид.

Попробуйте использовать

AlertDialog.Builder builder = new AlertDialog.Builder(context) 
    .setTitle("Question") 
    .setView() 
    .setPositiveButton() 
    .setNegativeButton() 
    .create().show(); 
    } 
}); 
+0

Если я делаю это _nothing_, то происходит, когда я нажимаю кнопку - нет исключения, но также нет диалога. – Nestor

+0

Я редактирую мой код try this plz – eddykordo

+0

Изменение порядка ничего не меняет. Вид не показан. – Nestor

0

android.util.AndroidRuntimeException: requestFeature() должна вызываться перед добавлением содержимого

Вы должны поместить requestFeature, прежде чем установить вид контента. Пример:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.mainmenu); 
} 

НЕ:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.mainmenu); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
} 
+0

Я не использую _requestWindowFeature_, поэтому ваш ответ мне не помогает. – Nestor

+0

Да, похоже, что эта ошибка также возникает, когда вы не устанавливаете пользовательский вид перед созданием диалога. См. Этот ответ здесь: http: // stackoverflow.com/questions/4661459/dialog-problem-requestfeature-must-be-called-before-add-content – Jonty800

2

Вам нужно позвонить setView вместо setContentView:

dialog.setView(R.layout.question); 

и установить вид перед созданием диалога:

dialog.setView(R.layout.question).create(); 

[Edit]

AlertDialog dialog= builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() 
    { 

    public void onClick(DialogInterface dialog, int whichButton) 
    { 
     dialog.dismiss(); 
     CallMethod(); 
    } 

    }).setNegativeButton("No", new DialogInterface.OnClickListener() 
     { 
     public void onClick(DialogInterface dialog, int which) 
     { 
      dialog.dismiss(); 
     } 
     }).setView(R.layout.question).create(); 
+0

Нет функции _create_ для AlertDialog. Только AlertDialog.Builder имеет его, и это не работает. – Nestor

+0

См. Отредактированный ответ. Я имел в виду метод создания Builder. Вы пытались как в отредактированном ответе? –

0

Это, вероятно, лучше, чтобы написать свой собственный диалог класс:

private class CustomDialogClass extends Dialog implements View.OnClickListener { 
public CustomDialogClass(Activity a, String picturename) { 
     super(a); 
     this.c = a; 
     this.picturename = picturename; 

...

набор в OnCreate макете:

super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.custom_dialoglayout); 

и откройте его следующим образом:

CustomDialogClass cdd = new CustomDialogClass(); 
          cdd.getWindow()); 
          cdd.show(); 
Смежные вопросы