Eu queria saber se alguém poderia me ajudar. Estou tentando criar um AlertDialog personalizado. Para fazer isso, adicionei a seguinte linha de código no styles.xml
<resources>
<style name="CustomAlertDialog" parent="android:Theme.Dialog.Alert">
<item name="android:windowBackground">@drawable/color_panel_background</item>
</style>
</resources>
- color_panel_background.9.png está localizado na pasta drawable. Isso também está disponível na pasta res do SDK do Android.
A seguir, a atividade principal.
package com.customdialog;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
public class CustomDialog extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.setTheme(R.style.CustomAlertDialog);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("HELLO!");
builder .setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//MyActivity.this.finish();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//dialog.cancel();
}
});
AlertDialog alertdialog = builder.create();
alertdialog.show();
}
}
Para aplicar o tema a um AlertDialog, eu tive que definir o tema para o contexto atual.
No entanto, não consigo exibir o aplicativo AlertDialog personalizado. Alguém pode me ajudar com isso?
Respostas:
No Dialog.java (Android src), um ContextThemeWrapper é usado. Então você pode copiar a ideia e fazer algo como:
AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.AlertDialogCustom));
E então estilize como quiser:
fonte
@android:style/Theme.Dialog
público? Pode ser usado em seu lugar?Theme.AppCompat.Light.Dialog.Alert
estilo como pai do seu estilo personalizado. Mas, se você fizer isso, verifique se está importandoimport android.support.v7.app.AlertDialog;
e nãoimport android.app.AlertDialog
Eu estava tendo esse
AlertDialog
problema relacionado ao tema usando o sdk 1.6, conforme descrito aqui: http://markmail.org/message/mj5ut56irkrkc4nrResolvi o problema fazendo o seguinte:
Espero que isto ajude.
fonte
Eu escrevi um artigo no meu blog sobre como configurar o layout de um AlertDialog com arquivos de estilo XML. O principal problema é que você precisa de diferentes definições de estilo para diferentes parâmetros de layout. Aqui está um boilerplate baseado no estilo AlertDialog da Holo Light Platform versão 19 para um arquivo de estilo que deve abranger vários aspectos de layout padrão, como tamanhos de texto e cores de fundo.
fonte
fonte
Eu estava lutando com isso - você pode estilizar o plano de fundo da caixa de diálogo usando o
android:alertDialogStyle="@style/AlertDialog"
seu tema, mas ignora as configurações de texto que você possui. Como o @rflexor disse acima, isso não pode ser feito com o SDK antes do Honeycomb (bem, você pode usarReflection
).Minha solução, em poucas palavras, foi estilizar o plano de fundo da caixa de diálogo usando o descrito acima e, em seguida, definir um título e uma exibição de conteúdo personalizados (usando layouts iguais aos do SDK).
Meu invólucro:
alert_dialog_title.xml (extraído do SDK)
alert_dialog_message.xml
Em seguida, basta usar em
CustomAlertDialogBuilder
vez deAlertDialog.Builder
criar suas caixas de diálogo e apenas ligarsetTitle
esetMessage
como de costume.fonte
Você pode atribuir diretamente um tema ao iniciar o Builder:
Em seguida, personalize seu tema em seu
values/styles.xml
fonte
Theme.AppCompat.Light.Dialog.Alert
Para caixa de diálogo personalizada:
basta chamar em
super(context,R.style.<dialog style>)
vez desuper(context)
no construtor de diálogoPara AlertDialog:
Basta criar alertDialog com este construtor:
fonte
Eu acho que não pode ser feito. Pelo menos não com o Builder. Estou trabalhando com o 1.6 e a implementação no Builder.create () é:
que chama o construtor "não sensível ao tema" do AlertDialog, que se parece com isso:
Há um segundo construtor no AlertDialog para alterar os temas:
que o construtor simplesmente não chama.
Se o Dialog for bastante genérico, tente escrever uma subclasse de AlertDialog, chamando o segundo construtor e use essa classe em vez do mecanismo Builder.
fonte
A melhor maneira de fazer isso é usar o diálogo personalizado e personalizar de acordo com as suas necessidades aqui é um exemplo de diálogo personalizado .....
}
Aqui está o layout xml
fonte
Qualquer pessoa que tente fazer isso dentro de um fragmento (usando a biblioteca de suporte, ou seja, antes da API 11) deve fazer o seguinte:
O @Rflexor me deu uma cutucada para estender o AlertDialog e expor o construtor, graças
fonte
AlertDialog.Builder(Context, int)
funciona apenas na API 11 e acima. Seu código falhará nas versões anteriores do Android.A solução da Arve Waltin parece boa, embora ainda não a tenha testado. Não há outra solução no caso de você ter problemas para conseguir que o trabalho .... Estender
AlertDialog.Builder
e substituir todos os métodos (por exemplo.setText
,setTitle
,setView
, Etc) não para definir o real texto / título / vista do diálogo, mas para criar uma nova visão dentro a visão do diálogo faz tudo lá. Então você é livre para estilizar tudo como quiser.Para esclarecer, no que diz respeito à classe pai, a Visualização está definida e nada mais.
No que diz respeito à sua classe estendida personalizada, tudo é feito nessa visualização.
fonte
Não tenho certeza de como a solução da Arve funcionaria em um diálogo personalizado com o construtor, onde a exibição é inflada por meio de um LayoutInflator.
A solução deve ser inserir o ContextThemeWrapper no inflator por meio de
cloneInContext()
:fonte
Isso pode ser feito simplesmente usando o setView () do Builder. Você pode criar qualquer visualização de sua escolha e alimentar o construtor. Isso funciona bem. Eu uso um TextView personalizado que é renderizado pelo construtor de diálogo. Não defino a mensagem e esse espaço é utilizado para renderizar minha visualização de texto personalizada.
fonte
fonte