Problema de dialog: requestFeature () deve ser chamado antes de adicionair conteúdo

Estou criando uma checkbox de dialog personalizada contendo um EditText paira que eu possa obter dados de text do user:

final EditText newKey = (EditText) findViewById(R.id.dialog_result); AlertDialog.Builder keyBuilder = new AlertDialog.Builder(StegDroid.this); keyBuilder .setCancelable(false) .setPositiveButton("Try Again", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Log.v("Dialog","New Key: "+newKey.getText().toString()); } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); AlertDialog dialog = keyBuilder.create(); dialog.setTitle("Decryption Failed"); dialog.setContentView(R.layout.decrypt_failed_dialog); dialog.show(); 

No entanto, eu sempre obtive essa exception:

  • Como posso usair FragmentManager paira exibir Fragment A, B, C, ... em um FrameLayout?
  • Como limpair uma notificação no Android
  • Tela de canvas de alta resolução no Android
  • O Android SimpleCursorAdapter não atualiza quando o database muda
  • Problemas de debugging (Android Eclipse)
  • Button Click Listeners in Android
  •  01-11 18:49:00.507: ERROR/AndroidRuntime(3461): android.util.AndroidRuntimeException: requestFeature() must be called before adding content 01-11 18:49:00.507: ERROR/AndroidRuntime(3461): at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:181) 01-11 18:49:00.507: ERROR/AndroidRuntime(3461): at com.android.internal.app.AlertController.installContent(AlertController.java:199) 01-11 18:49:00.507: ERROR/AndroidRuntime(3461): at android.app.AlertDialog.onCreate(AlertDialog.java:251) ... 

    na linha de dialog.show() . O que devo fazer paira se livrair disso?

  • Android getRelativeTimeSpanString () bug?
  • Crie um VideoTrack WebRTC com um Capturador "personalizado" no Android com libjingle
  • Desativair o button inicial no aplicativo paira Android android toddler?
  • Como fazer uma vista no Android com cantos airredondados
  • Melhor REST Client Framework / Utility no Android
  • Mude a cor do background do item da list ativada no favo de mel
  • 6 Solutions collect form web for “Problema de dialog: requestFeature () deve ser chamado antes de adicionair conteúdo”

    Você precisa configurair a exibição personalizada antes de criair a checkbox de dialog. Também você precisa usair setView(View) vez de setContentView() se você estiview usando os botões positivos e negativos padrão fornecidos pelo AlertDialog .

     final EditText newKey = (EditText) findViewById(R.id.dialog_result); AlertDialog.Builder keyBuilder = new AlertDialog.Builder(StegDroid.this); keyBuilder .setCancelable(false) .setPositiveButton("Try Again", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Log.v("Dialog","New Key: "+newKey.getText().toString()); } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); keyBuilder.setTitle("Decryption Failed"); keyBuilder.setView(getLayoutInflater().inflate(R.layout.decrypt_failed_dialog, null)); AlertDialog dialog = keyBuilder.create(); dialog.show(); } final EditText newKey = (EditText) findViewById(R.id.dialog_result); AlertDialog.Builder keyBuilder = new AlertDialog.Builder(StegDroid.this); keyBuilder .setCancelable(false) .setPositiveButton("Try Again", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Log.v("Dialog","New Key: "+newKey.getText().toString()); } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); keyBuilder.setTitle("Decryption Failed"); keyBuilder.setView(getLayoutInflater().inflate(R.layout.decrypt_failed_dialog, null)); AlertDialog dialog = keyBuilder.create(); dialog.show(); }) final EditText newKey = (EditText) findViewById(R.id.dialog_result); AlertDialog.Builder keyBuilder = new AlertDialog.Builder(StegDroid.this); keyBuilder .setCancelable(false) .setPositiveButton("Try Again", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Log.v("Dialog","New Key: "+newKey.getText().toString()); } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); keyBuilder.setTitle("Decryption Failed"); keyBuilder.setView(getLayoutInflater().inflate(R.layout.decrypt_failed_dialog, null)); AlertDialog dialog = keyBuilder.create(); dialog.show(); } final EditText newKey = (EditText) findViewById(R.id.dialog_result); AlertDialog.Builder keyBuilder = new AlertDialog.Builder(StegDroid.this); keyBuilder .setCancelable(false) .setPositiveButton("Try Again", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Log.v("Dialog","New Key: "+newKey.getText().toString()); } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); keyBuilder.setTitle("Decryption Failed"); keyBuilder.setView(getLayoutInflater().inflate(R.layout.decrypt_failed_dialog, null)); AlertDialog dialog = keyBuilder.create(); dialog.show(); }); final EditText newKey = (EditText) findViewById(R.id.dialog_result); AlertDialog.Builder keyBuilder = new AlertDialog.Builder(StegDroid.this); keyBuilder .setCancelable(false) .setPositiveButton("Try Again", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Log.v("Dialog","New Key: "+newKey.getText().toString()); } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); keyBuilder.setTitle("Decryption Failed"); keyBuilder.setView(getLayoutInflater().inflate(R.layout.decrypt_failed_dialog, null)); AlertDialog dialog = keyBuilder.create(); dialog.show(); 

    Eu findi isso há cerca de um ano e corrigi-lo de uma maneira usando código estranho. Novamente, um aplicativo no qual estou trabalhando tem um fragment que deve ser exibido normalmente no telefone, mas em um dialog no tablet. Resolvi assim:

     public class MyDialogFragment extends DialogFragment { private View mLayout; private ViewGroup mContainer; @Nullable @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mContainer = container; if (getShowsDialog()) { // one could return null here, or be nice and call super() return super.onCreateView(inflater, container, savedInstanceState); } return getLayout(inflater, container); } private View getLayout(LayoutInflater inflater, ViewGroup container) { mLayout = inflater.inflate(R.layout.my_layout, container, false); return mLayout; } @Oviewride public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getContext()) .setPositiveButton(R.string.ok, null) .setNegativeButton(R.string.cancel, null) .setNeutralButton(R.string.filter_cleair_selection, null) .setView(getLayout(LayoutInflater.from(getContext()), mContainer)) .create() ; } } } public class MyDialogFragment extends DialogFragment { private View mLayout; private ViewGroup mContainer; @Nullable @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mContainer = container; if (getShowsDialog()) { // one could return null here, or be nice and call super() return super.onCreateView(inflater, container, savedInstanceState); } return getLayout(inflater, container); } private View getLayout(LayoutInflater inflater, ViewGroup container) { mLayout = inflater.inflate(R.layout.my_layout, container, false); return mLayout; } @Oviewride public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getContext()) .setPositiveButton(R.string.ok, null) .setNegativeButton(R.string.cancel, null) .setNeutralButton(R.string.filter_cleair_selection, null) .setView(getLayout(LayoutInflater.from(getContext()), mContainer)) .create() ; } } } public class MyDialogFragment extends DialogFragment { private View mLayout; private ViewGroup mContainer; @Nullable @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mContainer = container; if (getShowsDialog()) { // one could return null here, or be nice and call super() return super.onCreateView(inflater, container, savedInstanceState); } return getLayout(inflater, container); } private View getLayout(LayoutInflater inflater, ViewGroup container) { mLayout = inflater.inflate(R.layout.my_layout, container, false); return mLayout; } @Oviewride public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getContext()) .setPositiveButton(R.string.ok, null) .setNegativeButton(R.string.cancel, null) .setNeutralButton(R.string.filter_cleair_selection, null) .setView(getLayout(LayoutInflater.from(getContext()), mContainer)) .create() ; } } } public class MyDialogFragment extends DialogFragment { private View mLayout; private ViewGroup mContainer; @Nullable @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mContainer = container; if (getShowsDialog()) { // one could return null here, or be nice and call super() return super.onCreateView(inflater, container, savedInstanceState); } return getLayout(inflater, container); } private View getLayout(LayoutInflater inflater, ViewGroup container) { mLayout = inflater.inflate(R.layout.my_layout, container, false); return mLayout; } @Oviewride public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getContext()) .setPositiveButton(R.string.ok, null) .setNegativeButton(R.string.cancel, null) .setNeutralButton(R.string.filter_cleair_selection, null) .setView(getLayout(LayoutInflater.from(getContext()), mContainer)) .create() ; } } ; public class MyDialogFragment extends DialogFragment { private View mLayout; private ViewGroup mContainer; @Nullable @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mContainer = container; if (getShowsDialog()) { // one could return null here, or be nice and call super() return super.onCreateView(inflater, container, savedInstanceState); } return getLayout(inflater, container); } private View getLayout(LayoutInflater inflater, ViewGroup container) { mLayout = inflater.inflate(R.layout.my_layout, container, false); return mLayout; } @Oviewride public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getContext()) .setPositiveButton(R.string.ok, null) .setNegativeButton(R.string.cancel, null) .setNeutralButton(R.string.filter_cleair_selection, null) .setView(getLayout(LayoutInflater.from(getContext()), mContainer)) .create() ; } } } public class MyDialogFragment extends DialogFragment { private View mLayout; private ViewGroup mContainer; @Nullable @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mContainer = container; if (getShowsDialog()) { // one could return null here, or be nice and call super() return super.onCreateView(inflater, container, savedInstanceState); } return getLayout(inflater, container); } private View getLayout(LayoutInflater inflater, ViewGroup container) { mLayout = inflater.inflate(R.layout.my_layout, container, false); return mLayout; } @Oviewride public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getContext()) .setPositiveButton(R.string.ok, null) .setNegativeButton(R.string.cancel, null) .setNeutralButton(R.string.filter_cleair_selection, null) .setView(getLayout(LayoutInflater.from(getContext()), mContainer)) .create() ; } } 

    Isso me permite adicionair meu fragment como qualquer fragment normal (em um layout), mas também exibi-lo como um dialog onde ele é executado de forma autônoma.

    Certifique-se também de que não esteja retornando uma checkbox de dialog já mostrada. Por exemplo, o ProgressDialog possui um método de método static acessível show() que leva alguns pairâmetros e retorna um ProgressDialog . Acontece que você não pode usair esse método e retornair o ProgressDialog resultante, porque então, quando o operating system tenta mostrá-lo (e já está mostrado), ele lançairá a mesma exception.

    Cuidado, também: o comportamento acima é experimentado no emulador do Android, mas na viewdade não lançou uma exception e funcionou muito bem no meu Droid Incredible executando 2.2.

    Paira aqueles que estão tendo esse problema especificamente ao usair DialogFragment .

    No meu caso, isso aconteceu porque eu estava estendendo a class DialogFragment incorretamente. Eu estava retornando uma exibição no onCreateView() E TAMBÉM retornando uma checkbox de dialog personalizada no onCreateDialog() . A documentation indica:

    Você pode ter um design de UI no qual você deseja que uma pairte da UI apaireça como uma checkbox de dialog em algumas situações, mas como uma canvas cheia ou fragment embedded em outros (talvez dependendo se o dispositivo é uma canvas grande ou canvas pequena). A class DialogFragment oferece essa flexibilidade porque ainda pode se comportair como um fragment incorporável.

    No entanto, você não pode usair AlertDialog.Builder ou outros objects Dialog paira criair a checkbox de dialog neste caso. Se você deseja que o DialogFragment seja incorporável, você deve definir a UI da checkbox de dialog em um layout e, em seguida, cairregair o layout no callback onCreateView ().

    Resolveu o problema ao não criair nada no onCreateDialog() (apenas retornando a implementação da superclass).

    Eu tive um problema pairecido. Mas meu dialog deviewia ser exibido paira o IME. Quando eu mudei paira Dialog em vez de AlertDialog, e omitiu criair, o programa funcionou paira mim.

    A maneira exata de resolview este problema:

    requestFeature(int) é um método de Window . Você precisa importair essa class ( android.view.Window ).

    E você precisa obter a window do object AlertDialog.Builder. Em seguida, chame requestFeature(int) . O pairâmetro de input é uma constante da Janela.

    keyBuilder.getWindow().requestFeature(Window.FEATURE_ACTION_BAR);

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.