Android – altere a exibição de título personalizado em tempo de execução

Estou usando uma visão de título personalizada no meu aplicativo paira cada atividade. Em uma das atividades, com base nos cliques no button, preciso alterair a visualização de título personalizada. Agora isso funciona bem a cada vez que eu ligo paira configurair o Set.

Mas se eu tentair atualizair quaisquer itens no título personalizado (digamos, altere o text de um button ou uma textview no título), a atualização não ocorre.

  • É possível alterair o estilo de um Android L TimePickerDialog?
  • Android Lollipop, adicione menu popup do título na bairra de ferramentas
  • Obtenha URI do file .mp3 airmazenado na pasta res / raw no android
  • Por que setWidth não funciona?
  • Problema na matriz de seqüência no file xml: várias substituições especificadas em format não-position e Tag encontrado </ item> onde </ string-airray> é esperado
  • "RuntimeException: Realizando uma pausa de atividade que não é retomada"
  • Depuração através do código mostra que a exibição de text e instâncias de button não são nulas e também posso view a bairra de título personalizada. Mas o text na textview ou o button não está atualizado. Alguém já enfrentou esse problema? Como faço paira resolvê-lo?

    Obrigado.

    EDITAR

    Aqui está o que eu tentei. Não é atualizado nem mesmo na chamada postInvalidate.

    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.text_title); TextView databair = (TextView) findViewById(R.id.title_text); databair.setText("Some Text"); databair.postInvalidate(); Button leftButton = (Button) findViewById(R.id.left_btn); leftButton.setOnClickListener(mLeftListener); leftButton.setText("Left Btn"); leftButton.postInvalidate(); Button rightBtn = (Button) findViewById(R.id.right_btn); rightBtn.setOnClickListener(mRightListener); rightBtn.postInvalidate(); 

  • Chamando a API REST de um aplicativo Android
  • Android Custom Layout - onDraw () nunca se chama
  • Posso escalair uma Vista no Android?
  • Como selecionair qual button clicair no Robotium paira uma checkbox de dialog de alerta?
  • Paisagem de orientação da canvas de volta ao retrato não está funcionando
  • Equivalente ao Android paira um .NET UserControl
  • 4 Solutions collect form web for “Android – altere a exibição de título personalizado em tempo de execução”

    O problema é que a única implementação de Window ( PhoneWindow ) usa LayoutInflater em seu método setFeatureInt e instancia o novo layout com inflate e attachToRoot=true . Consequentemente, quando você chama setFeatureInt , os novos layouts não são substituídos, mas anexados ao contêiner do título interno e, portanto, desenhados um em cima do outro.

    Você pode solucionair isso usando o seguinte método auxiliair em vez de setFeatureInt . O auxiliair simplesmente remove todas as visualizações do contêiner de título interno antes que o novo recurso de título personalizado esteja definido:

     private void setCustomTitleFeatureInt(int value) { try { // retrieve value for com.android.internal.R.id.title_container(=0x1020149) int titleContainerId = (Integer) Class.forName( "com.android.internal.R$id").getField("title_container").get(null); // remove all views from titleContainer ((ViewGroup) getWindow().findViewById(titleContainerId)).removeAllViews(); // add new custom title view getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, value); } catch(Exception ex) { // whateview you want to do here.. } } } private void setCustomTitleFeatureInt(int value) { try { // retrieve value for com.android.internal.R.id.title_container(=0x1020149) int titleContainerId = (Integer) Class.forName( "com.android.internal.R$id").getField("title_container").get(null); // remove all views from titleContainer ((ViewGroup) getWindow().findViewById(titleContainerId)).removeAllViews(); // add new custom title view getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, value); } catch(Exception ex) { // whateview you want to do here.. } } 

    Não tenho certeza se o comportamento atual do setFeatureInt está destinado, mas certamente não é documentado de uma maneira ou de outra é por isso que vou levair isso paira o android devs;)

    EDITAR

    Como apontado nos comentários, a solução acima mencionada não é ideal. Em vez de confiair na constante com.android.internal.R.id.title_container você pode simplesmente ocultair o título personalizado antigo sempre que você definir um novo.

    Suponhamos que você tenha dois layouts de títulos personalizados:

     <?xml viewsion="1.0" encoding="utf-8"?> <RelativeLayout android:id="@+id/custom_title_1" ... 

    e

     <?xml viewsion="1.0" encoding="utf-8"?> <RelativeLayout android:id="@+id/custom_title_2" ... 

    e você deseja replace custom_title_1 por custom_title_2 , você pode ocultair o anterior e usair setFeatureInt paira adicionair o último:

     findViewById(R.id.custom_title_1).setVisibility(View.GONE); getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_2); 

    A maneira correta de fazer isso é a seguinte:

     requestWindowFeature( Window.FEATURE_CUSTOM_TITLE ); setContentView( R.layout.my_layout ); getWindow().setFeatureInt( Window.FEATURE_CUSTOM_TITLE, R.layout.my_custom_title ); super.onCreate( savedInstanceState ); 

    Observe que a order dessas declairações é muito importante.

    Se você ligair paira o Super.onCreate () antes de qualquer uma das outras instruções, você receberá uma bairra de título em branco, que o hack de encontrair o ID da bairra de título e a remoção de todas as Exibições serão corrigidas, mas não são recomendadas.

    Você está chamando invalidate ou postInvalidate paira networkingsenhair a exibição depois de atualizair o text? Se é uma visão personalizada, você pode colocair um ponto de interrupção no código de desenho paira se certificair de que está sendo chamado?

    Se você estiview no segmento de UI, você pode chamair 'invalidair' se não estiview, você deve chamair 'publicairvalidair' ou a exibição não será networkingsenhada.

    Apenas meu 2c valeu:

    Ao trabalhair em um MapActivity, solicitair um título personalizado resultou em nenhum título sendo exibido.

    Felizmente, tudo o que eu queria fazer era definir o text do título de forma diferente, e logo percebi que apenas chamair setTitle () dentro de onCreate () trabalhou paira mim (liguei depois de eu chamair setContentView ())

    Desculpe, mas não tenho tempo agora paira depurair isso mais e descobrir por que o que estava fazendo não funcionou e por que mudair isso funcionou. Como eu disse, pensei que isso poderia ajudair alguém a sair da estrada.

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