以编程方式设置微调文本颜色滞后,速度慢,错误的颜色为瞬间

时间:2015-11-25 04:38:11

标签: android spinner

TLDR:我的微调器瞬间显示错误的颜色。

我的旋转器有问题。每当我运行应用程序时,如果活动没有缓存在内存中,它有时会滞后。在我将其设置为正确的颜色之前,文本是默认颜色(如黑色)。它看起来真的很不专业。

视频: 请观看此屏幕录制以查看此操作: https://drive.google.com/file/d/0By2AG5yaBEhMRnRsbVBDU251STQ/view

加载页面时如何查找一秒钟: enter image description here

如何看待延迟时间(以及从一开始就应该如何看待): enter image description here

代码:

public class MyActivity extends AppCompatActivity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        Spinner spinner = (Spinner) findViewById(R.id.spinner);

        //Get rid of the normal toolbar's title, because the spinner is replacing the title.
        getSupportActionBar().setDisplayShowTitleEnabled(false);

        //Set the choices on the spinner by setting the adapter.
        spinner.setAdapter(new SpinnerAdapter(toolbar.getContext(), new String[]{"Overview", "Story", "Specifications", "Poll", "Video"}, accentColor, backgroundColor));

        //Set the listener for when each option is clicked.
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
        {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
            {
                //Change the selected item's text color
                ((TextView) view).setTextColor(backgroundColor);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent)
            {
            }
        });
    }
}

XML:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
                                   xmlns:app="http://schemas.android.com/apk/res-auto"
                                   android:layout_width="match_parent"
                                   android:layout_height="wrap_content"
                                   android:background="@color/ColorPrimary"
                                   android:elevation="4dp">
    <Spinner
        android:id="@+id/spinner"
        app:popupTheme="@style/AppTheme.PopupOverlay"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</android.support.v7.widget.Toolbar>

1 个答案:

答案 0 :(得分:5)

我做错了什么:

之前,我正在遵循this answer的建议,并在onItemSelected方法中设置文本颜色,但该方法仅在UI完成后自动调用,并且您无法调用{{ 1}}直接来自您的代码。这导致了滞后。 (但是当您从下拉列表中选择项目时仍然需要它 - 请参阅我对此问题的解决方案。)

<强>解决方案:

策略是获取“选定”视图并在onCreate完成之前设置其文本颜色。当我在调试器中测试它时,在onItemSelected方法期间没有显示任何UI,所以这保证可以工作。

我只需在调用onCreate后添加此代码:

setAdapter(...)

关键点是使用//Set the text color of the Spinner's selected view (not a drop down list view) spinner.setSelection(0, true); View v = spinner.getSelectedView(); ((TextView)v).setTextColor(backgroundColor); 参数调用spinner.setSelection(0, true) 否则,如果您只是致电true,则视图spinner.setSelection(0)会是空的。感谢this answer,我发现了这一点。

完整方法:

这是完整的方法。 注意: v中的代码仍然需要存在!否则,每次从下拉列表中选择一个项目时,它的颜色都会错误。

onItemSelected

有关setSelection方法源代码的更多信息,请参阅此处的AbsSpinner.java代码:https://android.googlesource.com/platform/frameworks/base/+/jb-release/core/java/android/widget/AbsSpinner.java

这是Spinner.java,如果有帮助:https://android.googlesource.com/platform/frameworks/base/+/jb-release/core/java/android/widget/Spinner.java