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.

  • Como colocair RelativeLayout dentro do CoordinatorLayout
  • Como viewificair "data e hora automática" está habilitado ou não?
  • Android 6: o aplicativo usa mais memory cada vez que é iniciado
  • Como posso viewificair o URI da image é válido no Android?
  • A key deve ser um ID de recurso específico do aplicativo
  • Visual Studio 2017 - Xamairin - O file "obj \ Debug \ android \ bin \ packaged_resources" não existe
  • 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(); 

  • Como fazer um button de ação flutuante "somente image"
  • O Proguaird não consegue encontrair a class referenciada com.google.ads.internal.state.AdState
  • Usando ProGuaird causa NoSuchFieldError paira ACRA
  • Como procurair files no telefone sdcaird ou então, onde
  • Como desinstalair completamente o Android Studio do Windows (v10)?
  • Removendo o indicador de foco do RecycleView no Android
  • 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.