6

我正在尝试在 Android 中编写一些代码来在AttributeSetattrs.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);

}
}

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


}}

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>

错误 :

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

所以,这里是上面所有的代码和错误描述。我想MyCompoundMainActivity. 我知道如何使用XML诸如

<com.example.mycompoundbutton.MyCompound
     ... attributes here ...
> 
</com.example.mycompoundbutton.MyCompound>

上述结构将帮助我设计静态自定义布局,但不会帮助我设计动态布局。

那么,我怎样才能用一个来调用这个MyCompound类呢?MainActivityAttributeSet

4

3 回答 3

1

重新阅读后,您的问题之一在于该xyz属性是在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" />

然后在您的活动中,您只需将其充气:

// 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);

这样您就不需要考虑在视图类内部设置的属性;Android 将MyCompound(Context, AttributeSet)使用 XML 布局文件中设置的值为您调用构造函数。

如果您需要以编程方式设置 XYZ 参数,请公开一个MyCompound允许您设置它的公共方法。

于 2014-05-11T12:03:02.007 回答
0

我建议使用<com.example.mycompoundbutton.MyCompound>标签activity_main.xml而不是尝试在 Java 代码中创建实例。这将允许 Android 在您打电话时为您的视图充气,setContentView()而无需自己玩充气机。您可以将所有标准属性应用于此标签,包括android:id. 然后,您可以findViewById()获取对MyCompound视图的引用,就像使用任何标准视图一样。

于 2017-04-22T23:29:07.510 回答
-1

伙计,我认为你的问题是听到

TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.MyCustomView, R.attr.xyz, 0);

未找到“ R.attr.xyz ”。你可以看到这个点击听

于 2014-05-11T12:09:47.353 回答