Nos documentos do Android em AlertDialog , ele fornece a seguinte instrução e exemplo para definir uma visualização personalizada em um AlertDialog:
Se você deseja exibir uma visão mais complexa, procure o FrameLayout chamado "corpo" e adicione sua visão a ele:
FrameLayout fl = (FrameLayout) findViewById(R.id.body);
fl.add(myView, new LayoutParams(FILL_PARENT, WRAP_CONTENT));
Em primeiro lugar, é bastante óbvio que add()
é um erro de digitação e é para ser addView()
.
Estou confuso com a primeira linha usando R.id.body. Parece que é o elemento do corpo do AlertDialog ... mas eu não posso simplesmente inserir isso no meu código b / c dá um erro de compilação. Onde R.id.body é definido ou atribuído ou qualquer outra coisa?
Aqui está meu código. Tentei usar setView(findViewById(R.layout.whatever)
no construtor mas não funcionou. Estou supondo porque não inflou manualmente?
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Title")
.setCancelable(false)
.setPositiveButton("Go", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
EditText textBox = (EditText) findViewById(R.id.textbox);
doStuff();
}
});
FrameLayout f1 = (FrameLayout)findViewById(R.id.body /*CURRENTLY an ERROR*/);
f1.addView(findViewById(R.layout.dialog_view));
AlertDialog alert = builder.create();
alert.show();
android
android-alertdialog
stormin986
fonte
fonte
.setView(getLayoutInflater().inflate(R.layout.dialog_view, null))
ao construtor. Crédito a Sergio Viudes, abaixo.Respostas:
Você está correto, é porque você não inflou manualmente. Parece que você está tentando "extrair" o id do "corpo" do layout da sua atividade e isso não funcionará.
Você provavelmente quer algo assim:
fonte
builder.setView(inflater.inflate(R.id.dialog, ROOT_VIEWGROUP[, ATTACH_TO_ROOT]))
, os documentos dizem que o grupo de exibição raiz é opcional. Isso deve ser usado neste caso? Se assim for ... ainda tenho que descobrir como obter uma referência para o AlertDialog ...View
você inflar. ChamefindViewById()
-oView
quando precisar de coisas do seu conteúdo. Consulte: github.com/commonsguy/cw-android/tree/master/Database/ConstantsVocê pode criar sua visualização diretamente do Layout Inflater, você só precisa usar o nome do seu arquivo XML de layout e a ID do layout no arquivo.
Seu arquivo XML deve ter um ID como este:
E então você pode definir seu layout no construtor com o seguinte código:
fonte
getCurrentFocus()
retornará o EditText e um EditText não pode ser convertido para um ViewGroup. Usarnull
como segundo argumento corrige isso.android.R.id.custom estava retornando null para mim. Consegui fazer isso funcionar, caso alguém tenha o mesmo problema,
Para referência, R.layout.simple_password é:
fonte
FrameLayout
como uma espécie de fragmento? Quando tentei a resposta de Andrewx2 acima, recebi um erro porque pensei que eu estava inflando dois layouts (imagino).Os documentos do Android foram editados para corrigir os erros.
A visão dentro do AlertDialog é chamada
android.R.id.custom
http://developer.android.com/reference/android/app/AlertDialog.html
fonte
Isso funcionou para mim:
fonte
Custom AlertDialog
Este exemplo completo inclui a transmissão de dados de volta para a Activity.
Crie um layout personalizado
Um layout com um
EditText
é usado para este exemplo simples, mas você pode substituí-lo por qualquer coisa que desejar.custom_layout.xml
Use a caixa de diálogo em código
As peças principais são
setView
para atribuir o layout personalizado aoAlertDialog.Builder
Este é o código completo do projeto de exemplo mostrado na imagem acima:
MainActivity.java
Notas
DialogFragment
subclasse conforme descrito na documentação .Veja também
fonte
EditText editText = customLayout.findViewById(R.id.editText);
deveria serEditText editText = (EditText) customLayout.findViewById(R.id.editText);
As linhas de código mais simples que funcionam para mim são as seguintes:
Qualquer que seja o tipo de layout (LinearLayout, FrameLayout, RelativeLayout) funcionará
setView
e apenas diferirá na aparência e comportamento.fonte
A maneira mais fácil de fazer isso é usando em
android.support.v7.app.AlertDialog
vez deandroid.app.AlertDialog
ondepublic AlertDialog.Builder setView (int layoutResId)
pode ser usado abaixo da API 21.fonte
AlertDialog.setView(View view)
adiciona a visualização fornecida aoR.id.custom FrameLayout
. A seguir está um trecho do código-fonte do Android a partir doAlertController.setupView()
qual finalmente lida com isso (mView
é a visão dada aoAlertDialog.setView
método).fonte
Depois de alterar o ID de android.R.id.custom, precisei adicionar o seguinte para fazer com que a visualização fosse exibida:
No entanto, isso fez com que a nova vista fosse renderizada em uma grande vista pai sem fundo, quebrando a caixa de diálogo em duas partes (texto e botões, com a nova vista no meio). Finalmente consegui o efeito que queria inserindo minha Visualização ao lado da mensagem:
Eu encontrei essa solução explorando a árvore de visualização com View.getParent () e View.getChildAt (int). Não estou muito feliz com nenhum dos dois. Nada disso está nos documentos do Android e, se eles alterarem a estrutura do AlertDialog, isso pode falhar.
fonte
Faria mais sentido fazer dessa maneira, com menos quantidade de código.
Para obter uma lista expandida de coisas que você pode definir, comece a digitar
.set
no Android Studiofonte