如何以编程方式使用 ColorStateList 设置 FloatingActionButton 的 backgroundTint?
How to programmatically set backgroundTint of FloatingActionButton with ColorStateList?
通过 setBackgroundTintList
方法以编程方式设置我的 FloatingActionButton
的 backgroundTint
不起作用,但通过 XML app:backgroundTint
标记设置它却起作用 - 为什么是吗?
fab_background_color.xml 颜色列表状态为:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true"
android:color="#654321"/>
<item android:color="#123456"/>
</selector>
我的 activity 布局是:
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.FloatingActionButton
android:id="@+id/test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
</android.support.design.widget.CoordinatorLayout>
和activity代码:
public class SampleActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_position_sample);
final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.test);
// Uncomment to test - this does NOT work however.
//fab.setBackgroundTintList(getResources().getColorStateList(R.color.fab_background_color));
fab.setOnClickListener(new View.OnClickListener()
{
@Override public void onClick(View v)
{
if (fab.isSelected())
fab.setSelected(false);
else
fab.setSelected(true);
}
});
}
}
如果我添加:
fab.setBackgroundTintList(getResources().getColorStateList(R.color.fab_background_color));
或:
fab.setBackgroundTintList(ContextCompat.getColorStateList(this, R.color.fab_background_color));
设置点击监听器之前的activity代码,没有任何反应。
如果我添加:
app:backgroundTint="@color/fab_background_color"
对于 FloatingActionButton 的 activity 布局代码,我得到了预期的行为。
有什么想法吗?我做错了什么吗?
使用这个:
fab.setBackgroundTintList(ContextCompat.getColorStateList(getApplicationContext(), R.color.purple_200));
干杯!
此问题已从 Android 支持库 25.1.0
开始解决
参见:https://code.google.com/p/android/issues/detail?id=227428
由于 setBackgroundTintList
仅在 API 21+ 中受支持,您可以使用 ViewCompat。
ViewCompat.setBackgroundTintList(
fab,
ContextCompat.getColorStateList(
getApplicationContext(),
R.color.purple_200
)
);
通过 setBackgroundTintList
方法以编程方式设置我的 FloatingActionButton
的 backgroundTint
不起作用,但通过 XML app:backgroundTint
标记设置它却起作用 - 为什么是吗?
fab_background_color.xml 颜色列表状态为:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true"
android:color="#654321"/>
<item android:color="#123456"/>
</selector>
我的 activity 布局是:
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.FloatingActionButton
android:id="@+id/test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
</android.support.design.widget.CoordinatorLayout>
和activity代码:
public class SampleActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_position_sample);
final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.test);
// Uncomment to test - this does NOT work however.
//fab.setBackgroundTintList(getResources().getColorStateList(R.color.fab_background_color));
fab.setOnClickListener(new View.OnClickListener()
{
@Override public void onClick(View v)
{
if (fab.isSelected())
fab.setSelected(false);
else
fab.setSelected(true);
}
});
}
}
如果我添加:
fab.setBackgroundTintList(getResources().getColorStateList(R.color.fab_background_color));
或:
fab.setBackgroundTintList(ContextCompat.getColorStateList(this, R.color.fab_background_color));
设置点击监听器之前的activity代码,没有任何反应。
如果我添加:
app:backgroundTint="@color/fab_background_color"
对于 FloatingActionButton 的 activity 布局代码,我得到了预期的行为。
有什么想法吗?我做错了什么吗?
使用这个:
fab.setBackgroundTintList(ContextCompat.getColorStateList(getApplicationContext(), R.color.purple_200));
干杯!
此问题已从 Android 支持库 25.1.0
开始解决参见:https://code.google.com/p/android/issues/detail?id=227428
由于 setBackgroundTintList
仅在 API 21+ 中受支持,您可以使用 ViewCompat。
ViewCompat.setBackgroundTintList(
fab,
ContextCompat.getColorStateList(
getApplicationContext(),
R.color.purple_200
)
);