当我使用android文件'MultiAutoCompleteTextView.java'时,如何解决错误“com.android.internal.R无法解决”,

时间:2010-08-15 09:18:32

标签: android

我想在文件上实现自己的Tokenizer “MultiAutoCompleteTextView.java”,

但是当我尝试

时遇到错误“com.android.internal.R cannot be resolved

将“MultiAutoCompleteTextView.java”导入我的项目。

代码:

public class MultiAutoCompleteTextView extends AutoCompleteTextView {
    private Tokenizer mTokenizer;

    public MultiAutoCompleteTextView(Context context) {
        this(context, null);
    }

    public MultiAutoCompleteTextView(Context context, AttributeSet attrs) {
        this(context, attrs, com.android.internal.R.attr.autoCompleteTextViewStyle);
    }

    public MultiAutoCompleteTextView(Context context, AttributeSet attrs, int defStyle)     {
        super(context, attrs, defStyle);
    }
    .
    .
    .
}

我没有研究解决这个问题的任何解决方案。如何纠正“com.android.internal.R.attr.autoCompleteTextViewStyle”我自己的attr?

感谢您提出任何建议。

5 个答案:

答案 0 :(得分:12)

您可以使用

    public MultiAutoCompleteTextView(Context context, AttributeSet attrs) {
      this(context, attrs,
        Resources.getSystem().getIdentifier("autoCompleteTextViewStyle", "attr", "android");
    }

您无法在编译时访问com.android.internal.R的id,但您可以在运行时访问已定义的内部资源并按名称获取资源。 您应该知道这比直接访问慢,并且无法保证在未来的android版本或特定于供应商的版本中可以使用内部资源。

答案 1 :(得分:3)

尝试从attrs.xml复制attr条目:

<attr name="autoCompleteTextViewStyle" format="reference" />

在您的应用中添加res/values/attrs.xml并将此行放入其中。 最后,更新您的代码以从您的包中引用R:

import com.your.package.R;
...
public MultiAutoCompleteTextView(Context context, AttributeSet attrs) {
    this(context, attrs, R.attr.autoCompleteTextViewStyle);
}

此程序归功于inazaruk

答案 2 :(得分:1)

是的,你可以使用内部R和Java反射。

获取autoCompleteTextViewStyle:

Class clasz = Class.forName("com.android.internal.R$attr") 
Field field = clasz.getDeclaredField("autoCompleteTextViewStyle");
field.setAccessible(true); 
int autoCompleteTextViewStyle= (int)field.get(null);
如上所述,这种方式是黑客攻击,通常Android提供类似或相同的公共风格基于android.R

答案 3 :(得分:1)

这有效:

    int id = Resources.getSystem().getIdentifier("config_sms_capable", "bool", "android");
    Resources res = Resources.getSystem();
    boolean configSMSCapable = res.getBoolean(id);
    TextView displayText = findViewById(R.id.displayText);
    String configSMSCapableString = configSMSCapable ? "TRUE" : "FALSE";
    displayText.setText("config_sms_capable = " + configSMSCapableString);

您需要以相同的方式指定所需的变量。

答案 4 :(得分:0)

我不确定您是否可以从internal导入和引用。 作为解决方法,从android源代码下载引用,并包含在您自己的资源中,并从您的包中引用。