2012-06-12 4 views
11

Sto provando a modificare lo sfondo di ActionBar da un gestore. L'obiettivo finale è quello di passare il Gestore ad un AsyncTask, ma per ora anche chiamare Handler.sendMessage() da un Thread provoca strani comportamenti. Attraverso il debugger sono in grado di vedere che l'Handler riceve il Messaggio e successivamente esegue setActionBarBackground() fino alla fine.ActionBar setBackgroundDrawable() nulling background da Thread/Handler

L'ActionBar predefinito con il tratto di fondo blu scompare completamente dallo schermo e non viene sostituito dal nuovo GradientDrawable. Sospetto che lo sfondo sia in qualche modo annullato. Inoltre, quando mi concentro di nuovo su EditText, viene visualizzato lo sfondo ActionBar GradientDrawable corretto. Il comportamento che mi aspetterei è che lo sfondo cambi semplicemente azioneDone.

Qualsiasi intuizione sul motivo per cui questo sta accadendo sarebbe molto apprezzato!

codice rilevante:

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> 

risposta

18

soluzione di Hendrik fa il trucco, ma non quando si utilizza una vista titolo personalizzato. Questo funziona invece:

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

Potrebbe essere necessario un set di titolo per far funzionare tutto questo però.

+1

Questo ha funzionato. Non è necessario un titolo. –

+0

grazie @Mat lavorato per me, ma se avete bisogno di titolo si può solo alterare lo stato del titolo che consente :) – Antarix

+1

Se non si sa se il titolo sta mostrando o meno questo funziona: \t \t \t isDisplayingTitle booleano = (actionBar.getDisplayOptions() & ActionBar.DISPLAY_SHOW_TITLE)! = 0; actionBar.setDisplayShowTitleEnabled (! IsDisplayingTitle); actionBar.setDisplayShowTitleEnabled (isDisplayingTitle); –

0

Beh questo mi sembra un caso limite folle, e succede sia con ActionBarSherlock e Android implementazione di ActionBar. Ho finito per chiamare ab.hide() e ab.show() per aggirarlo ... :(

+0

Questo funziona. Una domanda. Hai capito come prevenire l'ascesa e la caduta del resto dello schermo? – javahead76

0

Sto usando ActionBarSherlock, e anch'io ho voluto cambiare lo sfondo Drawable di ActionBar tramite chiamate a setBackgroundDrawable() a volte arbitrari. Tuttavia, ho scoperto che dopo il colore di sfondo è impostata una volta, le successive chiamate a setBackgroundDrawable() semplicemente non sembrano avere alcun effetto. credo che questo è simile al problema che si è verificato.

per Ho appena messo uno View nel mio layout che compariva dietro l'ActionBar e reso trasparente l'ActionBar. L'altezza dello View è facilmente impostata all'altezza corretta chiamando getHeight() su t lui ActionBar.

4

Ho riscontrato lo stesso problema. Quando cambio dinamicamente lo sfondo della barra delle azioni con setBackgroundDrawable() in un nuovo GradientDrawable, la barra delle azioni diventa completamente nera.

Ho scoperto che questo è collegato al titolo della barra delle azioni. Non uso il titolo e l'ho impostato su una stringa vuota. A scopo di test, invece, l'ho impostato su una stringa di test "Test" e il problema con setBackgroundDrawable() è scomparso immediatamente. Sembra un bug in ICS per me.

Così, invece di nascondere e mostrare la barra delle azioni la seguente soluzione funziona per me:

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

Questa soluzione non funziona per me :(... solo il nascondi/mostra funziona nel caso maggio – fvisticot