Вопрос по actionbarsherlock, android-actionbar, android, handler – ActionBar setBackgroundDrawable () обнуляет фон из Thread / Handler

11

Я пытаюсь изменить фон панели действий из обработчика. Конечная цель - передать Handler в AsyncTask, но сейчас даже вызов Handler.sendMessage () из Thread приводит к странному поведению. Через отладчик я могу видеть, что обработчик получает сообщение и впоследствии выполняет setActionBarBackground () до конца.

Панель действий по умолчанию с синим нижним штрихом полностью исчезает с экрана и не заменяется новым GradientDrawable. Я подозреваю, что фон как-то обнуляется. Кроме того, когда я снова фокусируюсь на EditText, появляется правильный фон GradientDrawable ActionBar. Поведение, которое я ожидаю, заключается в простом изменении фона в actionDone.

Любое понимание того, почему это происходит, будет с благодарностью!

Соответствующий код:

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>

Ваш Ответ

4   ответа
18

но не при использовании пользовательского представления заголовка. Это работает вместо:

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

Вам может понадобиться набор заголовков, чтобы это работало.

Это сработало. Название не требуется.
спасибо @Mat работал для меня, но если вам нужен заголовок, вы можете просто изменить состояние включения заголовка :)
Если вы не знаете, показывает заголовок или нет, это работает: boolean isDisplayingTitle = (actionBar.getDisplayOptions () & amp; ActionBar.DISPLAY_SHOW_TITLE)! = 0; actionBar.setDisplayShowTitleEnabled (isDisplayingTitle!); actionBar.setDisplayShowTitleEnabled (isDisplayingTitle);
Я столкнулся с той же проблемой. Я добавил bar.setBackgroundDrawable (newBackground); в методе onCreate (), но позже, перемещая строки в onPostCreate (), он работал с изменением ориентации.
4

ли действий сsetBackgroundDrawable() к новомуGradientDrawableпанель действий становится черной.

Я обнаружил, что это связано с заголовком панели действий. Я не использую заголовок и установил его в пустую строку. В целях тестирования я установил для него тестовую строку & quot; Test & quot; вместо этого и проблема сsetBackgroundDrawable() немедленно исчез. Похоже, ошибка в ICS для меня.

Поэтому вместо того, чтобы скрывать и показывать панель действий, мне подходит следующий обходной путь:

actionBar.setBackgroundDrawable(newBackground);
actionBar.setTitle(".");
actionBar.setTitle("");
Этот обходной путь не работает для меня :( ... только скрыть / показать работает в случае
0

Drawable ActionBar через звонки вsetBackgroundDrawable() в произвольные времена. Однако я обнаружил, что после однократной установки цвета фона последующие вызовыsetBackgroundDrawable() просто, похоже, не имеет никакого эффекта. Я думаю, что это похоже на проблему, с которой вы столкнулись.

Чтобы обойти это, я обманул. Я просто поместилView в моем макете, который появится за ActionBar, и сделал сам ActionBar прозрачным. ВысотаView легко установить правильную высоту, позвонивgetHeight() на панели действий.

0

это похоже на безумный крайний случай, и это происходит как с ActionBarSherlock, так и с реализацией Android ActionBar. В итоге я вызвал ab.hide () и ab.show (), чтобы обойти это ... :(

Это работает. Один вопрос. Вы выяснили, как предотвратить взлеты и падения остальной части экрана?

Похожие вопросы