2012-06-12 18 views
11

Estoy tratando de cambiar el fondo de la barra de acciones desde un controlador. El objetivo final es pasar Handler a AsyncTask, pero por ahora incluso llamar a Handler.sendMessage() desde un Thread resulta en un comportamiento extraño. A través del depurador, puedo ver que el Controlador recibe el Mensaje y posteriormente ejecuta setActionBarBackground() hasta el final.ActionBar setBackgroundDrawable() nulling background from Thread/Handler

La barra de acciones predeterminada con el trazo inferior azul desaparece totalmente de la pantalla y no se reemplaza por el nuevo GradientDrawable. Sospecho que el fondo está siendo anulado de alguna manera. Además, cuando me concentro de nuevo en EditText, aparece el fondo correcto de GradientDrawable ActionBar. El comportamiento que esperaría es que el fondo cambie fácilmente en ActionDone.

¡Cualquier apreciación de por qué sucede esto 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> 

Respuesta

18

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

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

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

+1

Esto funcionó. No es necesario un título. –

+0

gracias @Mat trabajaron para mí, pero si necesita título que sólo puede alterar el estado de permitir título :) – Antarix

+1

Si usted no sabe si el título está mostrando o no funciona esto: \t \t \t isDisplayingTitle booleano = (actionBar.getDisplayOptions() & ActionBar.DISPLAY_SHOW_TITLE)! = 0; actionBar.setDisplayShowTitleEnabled (! IsDisplayingTitle); actionBar.setDisplayShowTitleEnabled (isDisplayingTitle); –

0

bien esto parece un caso extremo loco, y sucede tanto con ActionBarSherlock y el Android implementación de ActionBar. Terminé llamando a ab.hide() y ab.show() para solucionarlo ... :(

+0

Esto funciona. Una pregunta. ¿Has descubierto cómo prevenir el aumento y la caída del resto de la pantalla? – javahead76

0

También estoy usando ActionBarSherlock, y yo también he querido cambiar el fondo Drawable de ActionBar mediante llamadas a setBackgroundDrawable() a horas arbitrarias. Sin embargo, descubrí que una vez configurado el color de fondo una vez, las llamadas posteriores a setBackgroundDrawable() simplemente no parecen tener ningún efecto. Creo que esto es similar al problema que encontró.

Para evitarlo, hice trampas. Acabo de colocar un View en mi diseño que aparecería detrás de la barra de acciones, e hice transparente la barra de acciones. La altura del View se establece fácilmente en la altura correcta llamando al getHeight() en t él ActionBar.

4

He encontrado el mismo problema. Cuando cambio dinámicamente el fondo de la barra de acciones con setBackgroundDrawable() a un nuevo GradientDrawable, la barra de acciones se vuelve negra.

He descubierto que esto está conectado al título de la barra de acciones. No uso el título y lo configuré en una cadena vacía. Para fines de prueba, lo configuré como una cadena de prueba "Prueba" y el problema con setBackgroundDrawable() desapareció inmediatamente. Parece un error en ICS para mí.

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

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

Esta solución no funciona para mí :(... solo funciona el hide/show en may caso – fvisticot