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>
Esto funcionó. No es necesario un título. –
gracias @Mat trabajaron para mí, pero si necesita título que sólo puede alterar el estado de permitir título :) – Antarix
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); –