比方说,在我的API调用中,我有一个被调用的参数color.是否可以编辑或修改现有的R.colors.color以从API结果中分配颜色?
举个例子:
我打电话给我的API并返回green,现在我想用ie(绿色Toolbar,绿色TextView等)加载我的应用程序,这可能吗?
我的第一个想法是:
在colors.xml被调用上创建一个项目,demo然后为它指定一个默认颜色,然后demo在我想要的任何地方使用这个颜色(Button,TextView等等)然后我认为可以用API的结果以编程方式更改这个值,所以我不需要创建一个SharedPreferences或类似的东西,以避免更多的代码.
正如@YS对我说的那样
不幸的是,你必须手动设置文本或视图的颜色...... :(
我想如果有其他方法可以做到这一点,因为我不知道Activities我的项目将包含多少,所以如果有其他方法可以做到这一点我很高兴听到其他猜测.
我正在尝试@Jared Rummler的答案,也许我做错了什么......我创造了一个简单的Json,我把我的资产我解析了Json,我把它放在一个GlobalConstant然后我做了一个"简单的应用程序".
首先,我有一个TextView和a Button包含"your_special_color",并返回它我把GlobalConstant int如下:
case "your_special_color":
return GlobalConstant.color;
Run Code Online (Sandbox Code Playgroud)
然后我尝试的是我的第一个Activity有1 TextView和1,Button正如我之前所说,他们有颜色"your_special_color",我不想改变它,但我有一个Intent在我Button打开另一个Activity包含相同,但与GlobalConstant.color而且它没有改变.
我试过这样做(我的第二个活动):
public class Main2Activity extends AppCompatActivity {
private Res …Run Code Online (Sandbox Code Playgroud) 我需要知道当前主题的名称,我已经拥有主题的资源ID.谁知道如何获得当前主题的名称?
谢谢
public String getThemeName()
{
PackageInfo packageInfo;
try
{
packageInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_META_DATA);
int themeResId = packageInfo.applicationInfo.theme;
return getResources().getResourceEntryName(themeResId);
}
catch (NameNotFoundException e)
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud) 当我resolveAttribute()用来找出颜色值时?attr/colorControlNormal,我得到了236:
TypedValue typedValue = new TypedValue();
getTheme().resolveAttribute(R.attr.colorControlNormal, typedValue, true);
int color = typedValue.data;
// 236
Run Code Online (Sandbox Code Playgroud)
但是当我使用带有以下TextView元素的XML布局时:
<TextView
android:id="@+id/textView"
style="?android:attr/textAppearance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?attr/colorControlNormal"
android:text="@null" />
Run Code Online (Sandbox Code Playgroud)
...以及以下Java代码:
View textView = findViewById(R.id.textView);
int color = ((TextView) textView).getCurrentTextColor();
// -1979711488
Run Code Online (Sandbox Code Playgroud)
我的颜色值是 -1979711488
为何结果有所不同?我希望得到相同的颜色值,但它们不是.
第二种方法(我相信)返回正确的颜色值.为什么我的第一种方法错了?
我宁愿获得颜色值?attr/colorControlNormal而不需要使用实际元素.我怎样才能做到这一点?
我在主题中定义了自定义文本外观。我的主题看起来像这样
<style name="Theme.MyApp" parent="Theme.MaterialComponents.Light">
.....
<item name="textAppearanceHeadline3">@style/TextAppearance.MySpark.Headline3</item>
.....
</style>
Run Code Online (Sandbox Code Playgroud)
这是风格TextAppearance.MyApp.Headline3
<style name="TextAppearance.MyApp.Headline3" parent="TextAppearance.MaterialComponents.Headline3">
<item name="fontFamily">@font/avenir_next_demi</item>
<item name="android:textSize">40sp</item>
<item name="android:gravity">left|top</item>
<item name="android:textStyle">bold</item>
<item name="android:textColor">?attr/colorOnSurface</item>
</style>
Run Code Online (Sandbox Code Playgroud)
适用于 XML
<com.google.android.material.textview.MaterialTextView
android:textAppearance="?attr/textAppearanceHeadline3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/add_product_description"/>
Run Code Online (Sandbox Code Playgroud)
适用于以编程方式引用样式
textView.setTextAppearance(R.style.TextAppearance_MyApp_Headline3)
Run Code Online (Sandbox Code Playgroud)
不起作用 当我想使用 attr 以编程方式应用 textAppearance 时,我还找不到类似的方法。
textView.setTextAppearance(R.attr.textAppearanceHeadline3)
我想使用 attr 来帮助我切换不同的主题。