ActionBar setBackgroundDrawable () anulando el fondo de Thread / Handler

Estoy tratando de cambiar el fondo de la barra de acción de un manejador. El objetivo final es pasar el Handler a un AsyncTask, pero por ahora incluso llamar a Handler.sendMessage () de un hilo resulta en un comportamiento extraño. A través del depurador puedo ver que el manejador recibe el mensaje y posteriormente ejecuta setActionBarBackground () hasta el final.

El ActionBar predeterminado con el trazo inferior azul desaparece completamente de la pantalla y no es reemplazado por el nuevo GradientDrawable. Sospecho que el fondo está siendo de alguna manera anulado. Además, cuando me enfoco en el EditText de nuevo, aparece el fondo de ActionBar GradientDrawable correcto. El comportamiento que yo esperaría es para el fondo de un simple cambio en actionDone.

Cualquier idea de por qué esto está sucediendo sería muy apreciada!

Código relevante:

TestActivity.java

public class TestActivity extends RoboSherlockFragmentActivity { @InjectView(R.id.ET_test) EditText testET; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(MainApp.TAG, "onCreate"); setContentView(R.layout.test_activity); testET.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { if (i == EditorInfo.IME_ACTION_DONE) { String loc = testET.getText().toString(); InputMethodManager mgr = (InputMethodManager) getSystemService( Context.INPUT_METHOD_SERVICE); mgr.hideSoftInputFromWindow(testET.getWindowToken(), 0); Toast.makeText(TestActivity.this, "EditText done!", Toast.LENGTH_SHORT).show(); /*TestQuery tq = new TestQuery(TestActivity.this, mHandler); tq.execute();*/ new Thread(new Runnable() { public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } mHandler.sendMessage(new Message()); } }).start(); } return true; } }); } private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { //setActivityColors(); setActionBarBackground(); } }; private void setActionBarBackground() { ActionBar ab = getSupportActionBar(); //Drawable d = WidgetUtils.getActionBarDrawable(TestActivity.this, 0xFF00FFFF); GradientDrawable gd = new GradientDrawable( GradientDrawable.Orientation.TOP_BOTTOM, new int[]{0xFFFFFFFF, 0xFF000000}); gd.setCornerRadius(0f); ab.setBackgroundDrawable(gd); } } 

Test_activity.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="button"/> <EditText android:id="@+id/ET_test" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:singleLine="true" android:maxLines="1" android:lines="1" android:inputType="number" android:imeOptions="actionDone" android:nextFocusUp="@id/ET_test" android:nextFocusLeft="@id/ET_test"/> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="button2"/> </LinearLayout> 

La solución de Hendrik hace el truco, pero no cuando se usa una vista de título personalizada. Esto funciona en su lugar:

 actionBar.setBackgroundDrawable(newBackground); actionBar.setDisplayShowTitleEnabled(true); actionBar.setDisplayShowTitleEnabled(false); 

Puede que necesite un conjunto de títulos para que esto funcione.

He encontrado el mismo problema. Cuando cambio dinámicamente el fondo de la barra de acción con setBackgroundDrawable() a un nuevo GradientDrawable , la barra de acción se vuelve todo negro.

He descubierto que esto está conectado con el título de la barra de acción. No utilizo el título y lo he establecido en una cadena vacía. Para los propósitos de la prueba lo setBackgroundDrawable() a una cadena de prueba "prueba" en lugar de otro y el problema con setBackgroundDrawable() desapareció inmediatamente. Parece un error en ICS para mí.

Así que en lugar de ocultar y mostrar la barra de acción, la siguiente solución funciona para mí:

 actionBar.setBackgroundDrawable(newBackground); actionBar.setTitle("."); actionBar.setTitle(""); 

Bueno, esto parece un caso de borde loco, y sucede con ActionBarSherlock y la implementación de Android de ActionBar. Terminé llamando ab.hide () y ab.show () para trabajar alrededor de él … 🙁

Estoy utilizando ActionBarSherlock también, y yo también he querido cambiar el fondo Drawable de la ActionBar a través de llamadas a setBackgroundDrawable() en tiempos arbitrarios. Sin embargo, encontré que después de que el color de fondo se fija una vez, las llamadas posteriores a setBackgroundDrawable() apenas no parecen tener ningún efecto. Creo que esto es similar al problema que encontraste.

Para evitarlo, engañé. Acabo de colocar una View en mi disposición que aparecería detrás del ActionBar, y hecha el ActionBar mismo transparente. La altura de la View se ajusta fácilmente a la altura correcta llamando a getHeight() en la barra ActionBar.

  • Manejador u Oyentes. ¿Qué es mejor?
  • Android - ¿pueden los manejadores mainThread causar pérdidas de memoria?
  • Android, mensajería del manejador
  • La mejor manera de actualizar un widget de Android cada 20-30 segundos: Handler, Service or Alarm?
  • ¿Cómo retraso un método en un bucle for en java?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.