ошибка: requestFeature () должен быть вызван перед добавлением контента - все равно не будет работать - PullRequest
3 голосов
/ 27 сентября 2011

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

Я получаю вышеприведенный абенд по команде "show ()".

public void onCreate(Bundle savedInstanceState) { 
    try{

    super.onCreate(savedInstanceState);
    setContentView(R.layout.submitscoredummylayout);                
    scoreloopInit();
AlertDialog whatToUploadDialog;
whatToUploadDialog = new AlertDialog.Builder(YanivSubmitScoreActivity.this).create();
whatToUploadDialog.setContentView(R.layout.submitscoreprompt);
whatToUploadDialog.setTitle(R.string.uploadedScoreTitle);
whatToUploadDialog.setCancelable(false);


  ((CheckBox)whatToUploadDialog.findViewById(R.id.ckbScoreloop)).setChecked(settings.getUploadToSL());
  ((CheckBox)whatToUploadDialog.findViewById(R.id.ckbFacebook)).setChecked(settings.getUploadToFB());

  ((CheckBox) whatToUploadDialog.findViewById(R.id.ckbScoreloop)).setOnCheckedChangeListener(new OnCheckedChangeListener() { 

            @Override
            public void onCheckedChanged(CompoundButton ckBox, boolean isChecked) {
                settings.setUploadToSL(isChecked,true);
                findViewById(R.id.btnYes).setEnabled(isChecked||settings.getUploadToFB());
            }
            }); 

  ((CheckBox) whatToUploadDialog.findViewById(R.id.ckbFacebook)).setOnCheckedChangeListener(new OnCheckedChangeListener() { 

            @Override
            public void onCheckedChanged(CompoundButton ckBox, boolean isChecked) {
                settings.setUploadToFB(isChecked,true);
                findViewById(R.id.btnYes).setEnabled(isChecked||settings.getUploadToSL());
            }
         });        

  whatToUploadDialog.findViewById(R.id.btnYes).setOnClickListener(new OnClickListener() {
  @Override
      public void onClick(View v) {
                submitScore(SUBMIT_UPLOAD_TO_SL);
                whatToUploadDialog.dismiss();
      }
  });

  whatToUploadDialog.findViewById(R.id.btnNo).setOnClickListener(new OnClickListener() {
      @Override
          public void onClick(View v) {
                whatToUploadDialog.dismiss();
              finish();
          }
      });
whatToUploadDialog.show();
}

Logcat:

W/System.err(14969): android.util.AndroidRuntimeException: requestFeature() must be called before adding content
W/System.err(14969):    at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:184)
W/System.err(14969):    at com.android.internal.app.AlertController.installContent(AlertController.java:198)
W/System.err(14969):    at android.app.AlertDialog.onCreate(AlertDialog.java:251)
W/System.err(14969):    at android.app.Dialog.dispatchOnCreate(Dialog.java:307)
W/System.err(14969):    at android.app.Dialog.show(Dialog.java:225)
W/System.err(14969):    at ui.YanivSubmitScoreActivity.onCreate(YanivSubmitScoreActivity.java:105)
W/System.err(14969):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
W/System.err(14969):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
W/System.err(14969):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
W/System.err(14969):    at android.app.ActivityThread.access$2300(ActivityThread.java:125)
W/System.err(14969):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
W/System.err(14969):    at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err(14969):    at android.os.Looper.loop(Looper.java:123)
W/System.err(14969):    at android.app.ActivityThread.main(ActivityThread.java:4627)
W/System.err(14969):    at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err(14969):    at java.lang.reflect.Method.invoke(Method.java:521)
W/System.err(14969):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
W/System.err(14969):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
W/System.err(14969):    at dalvik.system.NativeStart.main(Native Method)

Ответы [ 3 ]

11 голосов
/ 22 марта 2013

У меня возникла такая же проблема.Я обнаружил, что проблема возникает только в том случае, если я выполняю обе следующие вещи:

  • Я не использую управляемые диалогами действий (activity.showDialog() -> activity.onCreateDialog() / onPrepareDialog())

  • Я делаю dialog.findViewById() (и это действительно разница между строкой success или исключением requestFeature!).

final Builder dialogBuilder = new AlertDialog.Builder(activity);
b.setView(rootView);
b.setIcon(android.R.drawable.ic_dialog_info);
b.setTitle(R.string.message_of_the_day_title);
b.setCancelable(false);
dialog = b.createDialog();
dialog.findViewById(R.id.myid); // this is the problem

dialog.findViewById() вызывает проблему, потому что вызывает

dialog.getWindow().getDecorView()

, а метод javadoc из getDecorView() говорит:

Обратите внимание, что вызов этой функции в первый раз "блокируется"различные характеристики окна, как описано в {@link #setContentView (View, android.view.ViewGroup.LayoutParams)}}.

Разве это не хорошо, findViewById() имеет побочный эффект, который вызывает на первый взгляд правильныйприложения для сбоя.Почему есть разница между Activity управляемыми диалоговыми окнами и обычными диалоговыми окнами, я не знаю, но я предполагаю, что getDecorView() делает некоторую магию для Activity управляемых диалогов.

Я сделал выше, потому что я перешел от использования Activity сам управлял диалогами для обработки диалогов.

Для меня решение состоит в том, чтобы манипулировать rootView, используя rootView.findViewById() вместо манипулирования диалогом.

4 голосов
/ 14 ноября 2012

Заменить следующую строку:

whatToUploadDialog.setContentView(R.layout.submitscoreprompt);

на:

whatToUploadDialog.setView(R.layout.submitscoreprompt);
0 голосов
/ 27 сентября 2011

Попробуйте позвонить

.setTitle(R.string.uploadedScoreTitle);

до

.setContentView(R.layout.submitscoreprompt);
...