MyP*_*rog 6 xml android xmlpullparser android-attributes
我试图在Android中编写一些代码来设置AttributeSetfrom attrs.xml文件中的参数.但我收到"资源未找到"错误.
Java代码
MainActivity.java
package com.example.mycompoundbutton;
import org.xmlpull.v1.XmlPullParser;
import android.os.Bundle;
import android.util.AttributeSet;
import android.util.Xml;
import android.app.Activity;
import android.content.res.Resources;
public class MainActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Resources res = this.getResources();
XmlPullParser parser = res.getXml(R.attr.xyz);
AttributeSet attrs = Xml.asAttributeSet(parser);
MyCompound my = new MyCompound(this,attrs);
my.MyTestFun(300,500);
}
}
Run Code Online (Sandbox Code Playgroud)
MyCompound.java
package com.example.mycompoundbutton;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.widget.CompoundButton;
public class MyCompound extends CompoundButton
{
public MyCompound(Context context, AttributeSet attrs)
{
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.MyCustomView, R.attr.xyz, 0);
a.recycle();
}
public void MyTestFun(int x,int y)
{
// Some Code to Execute
}}
Run Code Online (Sandbox Code Playgroud)
attrs.xml
<resources>
<declare-styleable name="MyCustomView">
<attr name="abc" format="integer"/>
<attr name="pqr" format="integer" />
</declare-styleable>
<attr name="xyz" format="integer"/>
</resources>
Run Code Online (Sandbox Code Playgroud)
错误:
05-11 07:29:27.345: E/AndroidRuntime(1919): FATAL EXCEPTION: main
05-11 07:29:27.345: E/AndroidRuntime(1919): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mycompoundbutton/com.example.mycompoundbutton.MainActivity}: android.content.res.Resources$NotFoundException: Resource ID #0x7f010000
05-11 07:29:27.345: E/AndroidRuntime(1919): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
05-11 07:29:27.345: E/AndroidRuntime(1919): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
05-11 07:29:27.345: E/AndroidRuntime(1919): at android.app.ActivityThread.access$600(ActivityThread.java:141)
05-11 07:29:27.345: E/AndroidRuntime(1919): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
05-11 07:29:27.345: E/AndroidRuntime(1919): at android.os.Handler.dispatchMessage(Handler.java:99)
05-11 07:29:27.345: E/AndroidRuntime(1919): at android.os.Looper.loop(Looper.java:137)
05-11 07:29:27.345: E/AndroidRuntime(1919): at android.app.ActivityThread.main(ActivityThread.java:5103)
05-11 07:29:27.345: E/AndroidRuntime(1919): at java.lang.reflect.Method.invokeNative(Native Method)
05-11 07:29:27.345: E/AndroidRuntime(1919): at java.lang.reflect.Method.invoke(Method.java:525)
05-11 07:29:27.345: E/AndroidRuntime(1919): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
05-11 07:29:27.345: E/AndroidRuntime(1919): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
05-11 07:29:27.345: E/AndroidRuntime(1919): at dalvik.system.NativeStart.main(Native Method)
05-11 07:29:27.345: E/AndroidRuntime(1919): Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x7f010000
05-11 07:29:27.345: E/AndroidRuntime(1919): at android.content.res.Resources.getValue(Resources.java:1118)
05-11 07:29:27.345: E/AndroidRuntime(1919): at android.content.res.Resources.loadXmlResourceParser(Resources.java:2304)
05-11 07:29:27.345: E/AndroidRuntime(1919): at android.content.res.Resources.getXml(Resources.java:983)
05-11 07:29:27.345: E/AndroidRuntime(1919): at com.example.mycompoundbutton.MainActivity.onCreate(MainActivity.java:24)
05-11 07:29:27.345: E/AndroidRuntime(1919): at android.app.Activity.performCreate(Activity.java:5133)
05-11 07:29:27.345: E/AndroidRuntime(1919): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
05-11 07:29:27.345: E/AndroidRuntime(1919): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
05-11 07:29:27.345: E/AndroidRuntime(1919): ... 11 more
Run Code Online (Sandbox Code Playgroud)
所以,这里是所有上面的代码和错误描述.我想打电话来MyCompound上课MainActivity.我知道如何使用XML诸如此类的文件来完成它
<com.example.mycompoundbutton.MyCompound
... attributes here ...
>
</com.example.mycompoundbutton.MyCompound>
Run Code Online (Sandbox Code Playgroud)
上面的结构将帮助我设计静态自定义布局,但它不会帮助我设计动态布局.
所以,我怎么能调用MyCompound类的MainActivity有AttributeSet?
重新阅读后,您的问题之一将在于该xyz属性是在 中的 CustomViewStyleable 之外声明的attrs.xml。
您可以让系统通过从 xml 扩充您的自定义视图来处理该问题,而不是直接调用自定义视图的构造函数。
创建一个仅包含您的自定义视图的 xml 布局文件,例如view_my_compound.xml:
<?xml version="1.0" encoding="utf-8"?>
<com.example.mycompoundbutton.MyCompound
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:xyz="2" />
Run Code Online (Sandbox Code Playgroud)
然后在您的 Activity 中,您只需将其膨胀即可:
// the view which will contain your MyCompoundButton
View container = findViewById(R.id.XXXXXXXX);
LayoutInflater inflater = getLayoutInflater();
MyCompound button = (MyCompound) inflater.inflate(R.layout.view_my_compound, container, true);
Run Code Online (Sandbox Code Playgroud)
这样您就不需要考虑在视图类内部设置的属性;Android 将MyCompound(Context, AttributeSet)使用 XML 布局文件中设置的值来为您调用构造函数。
如果您需要以编程方式设置 XYZ 参数,请公开一个MyCompound允许您设置它的公共方法。
| 归档时间: |
|
| 查看次数: |
10827 次 |
| 最近记录: |