Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ActionBar setBackgroundDrawable()从线程/处理程序清空背景_Android_Handler_Android Actionbar_Actionbarsherlock - Fatal编程技术网

Android ActionBar setBackgroundDrawable()从线程/处理程序清空背景

Android ActionBar setBackgroundDrawable()从线程/处理程序清空背景,android,handler,android-actionbar,actionbarsherlock,Android,Handler,Android Actionbar,Actionbarsherlock,我正在尝试从处理程序更改ActionBar的背景。最终目标是将处理程序传递给AsyncTask,但就目前而言,甚至从线程调用Handler.sendMessage()都会导致奇怪的行为。通过调试器,我可以看到处理程序接收到消息并随后一直运行setActionBarBackground() 带有蓝色底部笔划的默认操作栏将完全从屏幕上消失,并且不会被新的GradientDrawable替换。我怀疑背景在某种程度上被抹去了。此外,当我再次关注EditText时,会出现正确的GradientDrawab

我正在尝试从处理程序更改ActionBar的背景。最终目标是将处理程序传递给AsyncTask,但就目前而言,甚至从线程调用Handler.sendMessage()都会导致奇怪的行为。通过调试器,我可以看到处理程序接收到消息并随后一直运行setActionBarBackground()

带有蓝色底部笔划的默认操作栏将完全从屏幕上消失,并且不会被新的GradientDrawable替换。我怀疑背景在某种程度上被抹去了。此外,当我再次关注EditText时,会出现正确的GradientDrawable操作栏背景。我期望的行为是在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



这似乎是一个疯狂的边缘案例,ActionBarSherlock和ActionBar的Android实现都出现了这种情况。我最后调用了ab.hide()和ab.show()来解决这个问题……:(

我也在使用ActionBarSherlock,我也想通过调用
setBackgroundDrawable()来更改ActionBar的背景
Drawable
在任意时间。但是,我发现在设置一次背景颜色后,对
setBackgroundDrawable()
的后续调用似乎没有任何效果。我认为这与您遇到的问题类似


为了避开它,我作弊了。我只是在我的布局中放置了一个
视图
,它将出现在ActionBar后面,并使ActionBar本身透明。通过调用
getHeight()可以轻松地将
视图
的高度设置为正确的高度
在操作栏上。

我遇到了相同的问题。当我使用
setBackgroundDrawable()
将操作栏的背景动态更改为新的
GradientDrawable
时,操作栏将变为全黑

我发现这与操作栏标题有关。我没有使用标题,而是将其设置为空字符串。出于测试目的,我将其设置为测试字符串“test”,而
setBackgroundDrawable()
的问题立即消失。在我看来,这像是ICS中的一个bug

因此,与隐藏和显示动作栏不同,以下变通方法对我很有效:

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

Hendrik的解决方法可以做到这一点,但在使用自定义标题视图时却不行。相反,它可以:

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

不过,您可能需要设置一个标题才能正常工作。

这很有效。一个问题。您是否找到了防止屏幕其他部分上升和下降的方法?此解决方法对我不起作用:(…只有隐藏/显示在may Case中起作用谢谢@Mat对我起作用,但如果您需要标题,您可以更改启用标题的状态:)如果您不知道标题是否正在显示,则此操作有效:boolean isDisplayingTitle=(actionBar.getDisplayOptions()&actionBar.DISPLAY\u SHOW\u title)!=0;actionBar.setDisplayShowTitleEnabled(!isDisplayingTitle);actionBar.setDisplayShowTitleEnabled(isDisplayingTitle);我也面临同样的问题。我添加了bar.setBackgroundDrawable(newBackground);在onCreate()方法中,但后来将行移动到onPostCreate()中,它处理方向更改。
actionBar.setBackgroundDrawable(newBackground);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayShowTitleEnabled(false);