Android appcompat-v7:22.0.0以编程方式创建UI时的主题问题
更新到appcompat-v7:22后,我遇到了严重的主题问题。appcompat-v7:21没有出现下面描述的问题 我有一个静态添加片段的活动。片段视图仅以编程方式创建(没有扩展布局)。最终的活动视图包含两个按钮:一个直接在活动布局中创建,另一个通过片段以编程方式添加第二个按钮应与第一个按钮相似,因为没有指定自定义样式或属性值: 应用程序主题扩展了Android appcompat-v7:22.0.0以编程方式创建UI时的主题问题,android,android-appcompat,Android,Android Appcompat,更新到appcompat-v7:22后,我遇到了严重的主题问题。appcompat-v7:21没有出现下面描述的问题 我有一个静态添加片段的活动。片段视图仅以编程方式创建(没有扩展布局)。最终的活动视图包含两个按钮:一个直接在活动布局中创建,另一个通过片段以编程方式添加第二个按钮应与第一个按钮相似,因为没有指定自定义样式或属性值: 应用程序主题扩展了theme.AppCompat.NoActionBar 活动布局: 我在这里将此问题与新项目分开: 这是一个错误还是我遗漏了什么? 是否有可能为
theme.AppCompat.NoActionBar
活动布局:
我在这里将此问题与新项目分开:
这是一个错误还是我遗漏了什么?
是否有可能为此制定一个解决方案
编辑
这不是一个bug<代码>在布局中定义的小部件膨胀为视图层次结构中的按钮对象。可能的修复方法是在代码中创建TintButton而不是Button警告TintButton位于内部包装内,因此不应在生产代码中使用。据我所知,v21不支持根据材料指南自动设置按钮样式。我假设现在运行时创建的按钮没有样式,这可能被认为是一个bug 想到的可能解决方法(现在无法测试)是调用,而不是调用
new Button()
,new TintButton()
,其中TintButton是支持库中定义的类,假定为Button
的材质样式版本
我认为应该是
android.support.v7.internal.widget.TintButton
这个问题是在4月22日用appcompat rev 22.1修复的。现在,您可以使用普通按钮或新的AppCompatButton有趣的是,布局中的小部件膨胀为视图层次结构中的TintButton。将代码中的按钮更改为TintButton可修复此问题。谢谢,所以,这不是一个bug,它是一个特性:)我不知道是否应该使用internal
东西。您可以尝试在运行时添加一个编辑文本
或复选框
,而不是按钮
,或者在v21中已经着色的其他小部件。它们也有适当的着色类。除了在生产代码中使用它,我还研究了这个特性。现在我明白多了,谢谢!它在生产代码中工作吗?不,我们还没有将其投入生产。只要TintButton是暴露的,它就可以工作,但这不能保证在新的SDK版本中保持不变。抱歉,但我不理解你的解决方案:我有同样的问题,如果我想更改按钮颜色(对于Android KitKat和棒棒糖),保持连锁反应,我必须做什么?这不在这个问题的范围之内。请看:@jskierbity,这个链接很有用!
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:text="Super Button"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<fragment
android:id="@+id/myfragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.jskierbi.appcompat22test.MainFragment" />
</LinearLayout>
public class MainFragment extends Fragment {
@Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
LinearLayout layout = new LinearLayout(getActivity());
layout.setOrientation(LinearLayout.VERTICAL);
Button btn = new Button(getActivity());
btn.setText("Click me!");
layout.addView(btn);
return layout;
}
}