- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的 LayoutInflater.Factory
(下面的代码示例)调用 onCreateView
并与“com.android.support:support-v4:22.0.0”一起正常工作的主要问题.但是当我移动到“com.android.support:support-v4:22.1.0”或更高版本时,不会调用 onCreateView
。我不明白为什么?
//From many fragments i Call hintManager.inflate
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstanceState) {
layout = hintManager.inflate(inflater, R.layout.generate_code);
...
//here is HintManager method called from various fragments.
public View inflate(LayoutInflater inflater, int layoutResourceId) {
AttributeParser attributeParser = new AttributeParser();
LayoutInflater layoutInflater = attributeParser.getLayoutInflater(inflater);
final View v = layoutInflater.inflate(layoutResourceId, null);
//here AttributeParserFactory#onCreateView should be called, but it fails with 22.1+ support lib, but works with 22.0
attributeParser.setViewAttribute(v);
return v;
}
...
//example of factory, that works fine with 22.0 support lib
private Map<Integer, HashMap<Integer, String>> helpViewList;
private class AttributeParser {
private AttributeParserFactory mFactory;
private class AttributeParserFactory implements LayoutInflater.Factory{
@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
String id = attrs.getAttributeValue("http://schemas.android.com/apk/res/android", "id");
if(id != null){
// String with the reference character "@", so we strip it to keep only the reference
id = id.replace("@", "");
TypedArray libraryStyledAttributeList = context.obtainStyledAttributes(attrs, R.styleable.Help);
HashMap<Integer, String> libraryViewAttribute = new HashMap<Integer, String>();
int i = 0;
for(int attribute : R.styleable.Help){
String attributeValue = null;
if (attribute == R.styleable.Help_arrow || attribute == R.styleable.Help_padding) {
attributeValue = String.valueOf(libraryStyledAttributeList.getInteger(i, 0));
}
else {
attributeValue = libraryStyledAttributeList.getString(i);
}
if(attributeValue != null)
libraryViewAttribute.put(attribute, attributeValue);
i++;
}
if(!libraryViewAttribute.isEmpty()) {
helpViewList.put(Integer.valueOf(id), libraryViewAttribute);
}
libraryStyledAttributeList.recycle();
}
return null;
}
}
public AttributeParser(){
mFactory = new AttributeParserFactory();
}
public void clear() {
helpViewList.clear();
}
public LayoutInflater getLayoutInflater(LayoutInflater inflater) {
LayoutInflater layoutInflater = inflater.cloneInContext(inflater.getContext());
layoutInflater.setFactory(mFactory);
return layoutInflater;
}
public void setFactory(LayoutInflater inflater){
inflater.cloneInContext(inflater.getContext()).setFactory(mFactory);
}
public void setViewAttribute(Activity activity) {
for(Map.Entry<Integer, HashMap<Integer, String>> attribute : helpViewList.entrySet())
if(activity.findViewById((Integer) attribute.getKey()) != null)
activity.findViewById((Integer) attribute.getKey()).setTag(attribute.getValue());
}
public void setViewAttribute(View view) {
for(Map.Entry<Integer, HashMap<Integer, String>> attribute : helpViewList.entrySet())
if(view.findViewById((Integer) attribute.getKey()) != null)
view.findViewById((Integer) attribute.getKey()).setTag(attribute.getValue());
}
public Map<Integer, HashMap<Integer, String>> getAttributeList() {
return helpViewList;
}
public void setAttributeList(Map<Integer, HashMap<Integer, String>> attributeList) {
helpViewList = attributeList;
}
}
最佳答案
编辑后的答案:
要解决这个问题,我们应该使用 LayoutInflaterCompat.setFactory,它有助于在 Lollipop 之前/之后使用 LayoutInflater Factory。
这是例子
LayoutInflater layoutInflaterCopy = inflater.cloneInContext(inflater.getContext());
LayoutInflaterCompat.setFactory(layoutInflaterCopy, new LayoutInflaterFactory() {
@Override
public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
String id = attrs.getAttributeValue("http://schemas.android.com/apk/res/android", "id");
if(id != null){
// String with the reference character "@", so we strip it to keep only the reference
id = id.replace("@", "");
TypedArray libraryStyledAttributeList = context.obtainStyledAttributes(attrs, R.styleable.Help);
HashMap<Integer, String> libraryViewAttribute = new HashMap<Integer, String>();
int i = 0;
for(int attribute : R.styleable.Help){
String attributeValue = null;
if (attribute == R.styleable.Help_arrow || attribute == R.styleable.Help_padding) {
attributeValue = String.valueOf(libraryStyledAttributeList.getInteger(i, 0));
}
else {
attributeValue = libraryStyledAttributeList.getString(i);
}
if(attributeValue != null)
libraryViewAttribute.put(attribute, attributeValue);
i++;
}
if(!libraryViewAttribute.isEmpty()) {
helpViewList.put(Integer.valueOf(id), libraryViewAttribute);
}
libraryStyledAttributeList.recycle();
}
return null;
}
});
final View v = layoutInflaterCopy.inflate(layoutResourceId, null);
关于android - 22.1+ 支持库不调用 LayoutInflater.Factory onCreateView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32450723/
好吧,这很奇怪。当我在模拟器中运行应用程序时,我的 logcat 突然发生崩溃,之前我从未遇到过它,并且自上次在模拟器中运行应用程序以来我没有对我的应用程序进行任何更改几周前,它正在运行。 这是完整的
我使用了构造函数,但它不起作用。 LayoutInflater layoutInflater = new LayoutInflater(getContext()); Android Studio 用红
至少我认为这是问题所在。来自 API 文档: inflate(int resource, ViewGroup root) Inflate a new view hierarchy from the s
我有一个用于 listView 的自定义适配器。当我尝试膨胀某些 View 时,它会抛出异常。这是我的 getView() 代码: public View getView(int position,
我是 Android 开发的新手,我对 Android 开发社区中流传的“Inflate a View”这个词很好奇。 我知道它与调用 LayoutInflater 类的 Inflate 方法有关,但
这是我的文件代码,旨在使用布局动态添加 View 我指的是 http://maxmakedesign.co.uk/how-to/80/android-add-views-in-a-loop packa
我想在 OnCreateView 中设置 wordtoSpan 字符串。 我的代码: package com.tachles; import android.os.Bundle; import and
我有以下表示 ImageButton 的 xml 对象 我尝试使用以下代码将其膨胀并添加到 TableRow 中: LayoutInflater inflater= this.getLayout
事情是这样的,我有一个 RecycleView 适配器,它可以在 onCreateViewHolder 上扩展布局。当我尝试执行以下操作以发生这种情况时: 应用创建没有任何问题 进入多任务窗口 回到应
我只是偶尔在一台设备上遇到这个错误: 04-09 16:05:22.016: E/AndroidRuntime(31843): FATAL EXCEPTION: main 04-09 16
这是我的类 DownloadableProjectsFromWebAdapter 的 getView 方法: @Override public View getView(int position, V
我的问题是创建 LayoutInflater 实例的最佳方法是什么?有什么区别吗 LayoutInflater inflater = LayoutInflater.from(context); 和 L
我正在考虑编写一个自定义适配器来填充一个 ListView ,每行 3 个 TextView 。我找到了相当多的示例代码来执行此操作,但看起来最好的代码位于:http://www.anddev.org
我在 LayoutInflater 代码中看到实际 View 类是 instantiated via reflection (LayoutInflater - createView() 方法),但是,
我有一个 Fragment,它在 onCreateView 方法中有很多代码,所以我认为将这些代码放在外部线程中是个好主意。现在的问题是我必须在此线程中加载布局,但是如果我在 Activity 的 o
我们目前正在大学里使用 ListView 。我的讲师给了我们一个简单的应用程序,它在列表中显示邮件消息,当用户选择一个时,它会在新 Activity 中显示消息的内容。我几乎了解所有发生的事情,但我想
我对这段代码感到困惑 在这里,他们使用了抽象类并继承了它,最重要的是,他们在不创建对象的情况下调用了方法 附注完整代码:- https://github.com/udacity/ud839_Custo
我正在开发一个具有抽屉导航并且需要用户登录的应用程序。 到目前为止,我已经完成了整个用户登录/注册工作,并且我已经构建了抽屉导航。 我现在想做的是让抽屉导航上的 TextView 显示用户的全名和他/
我正在寻找一种方法来“扩充”Android XML 布局,这在编译时是未知的。我已经搜索了几个小时,总能找到答案,这是不可能的,因为 LayoutInflater 不能使用简单的 XML 文件。好的,
我试图在回收站 View 适配器中创建一个弹出窗口,以便在用户单击回收站 View 的某个项目时显示一个小菜单。这是弹出功能: public void Popup(final int id) {
我是一名优秀的程序员,十分优秀!