2014-05-11 13 views
6

Sto provando a scrivere del codice in Android per impostare i parametri in un AttributeSet dal file attrs.xml. Ma ricevo un errore "Risorsa non trovata".Come creare un AttributeSet in Android?

codice 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> 

Errore:

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 

Così, qui è tutto quanto sopra Codice e Error descrizione. Voglio chiamare la classe MyCompound da MainActivity. Io so come farlo utilizzando un file XML come

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

Questa struttura di cui sopra mi aiuterà a progettare un layout personalizzato statico, ma non mi aiuterà a progettare un layout dinamico.

Quindi, come posso chiamare la classe MyCompound da MainActivity con un AttributeSet?

+0

'com.example.mycompoundbutton.MainActivity.onCreate (MainActivity.java:24)' Cos'è la riga 24 di 'MainActiivty.java'? –

risposta

1

Dopo la rilettura, uno dei tuoi problemi risiede nel fatto che l'attributo xyz viene dichiarato all'esterno di CustomViewStyleable in attrs.xml.


Invece di chiamare direttamente il costruttore di visualizzazione personalizzata, è possibile lasciare che il sistema di gestire che gonfiando la visualizzazione personalizzata da XML.

Creare un file di layout xml che contenga solo la vista personalizzata, ad es. 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" /> 

Poi, nel tuo attività, ti basta gonfiare:

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

In questo modo non è necessario prendere in considerazione l'attributo set a parte all'interno della vostra classe di visualizzazione; Android chiamerà per te il costruttore MyCompound(Context, AttributeSet), con i valori impostati nel file di layout XML.

Se è necessario impostare il parametro XYZ a livello di codice, esporre un metodo pubblico in MyCompound che consente di impostarlo.

+0

Nessun amico riceve errore ... Il metodo da (Contesto) nel tipo LayoutInflater non è applicabile per gli argomenti (MainActivity, View, int) – MyProg

+0

scusa, 'LayoutInflater.from (this) .inflate (R.layout.view_my_compound, container, true); 'Ma considera anche la prima riga modificata di questa risposta. – ataulm

0

Guy Credo che il problema è sentire

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

"R.attr.xyz" è notfound. Si può vedere questo click Hear

0

Io suggerisco di usare un tag <com.example.mycompoundbutton.MyCompound> in activity_main.xml piuttosto che cercare di creare un'istanza nel codice Java. Ciò consentirà ad Android di gonfiare la tua vista quando chiami setContentView() senza giocare da solo con un inflator. Puoi applicare tutti gli attributi standard a questo tag, incluso android:id. Quindi puoi semplicemente fare findViewById() per ottenere un riferimento alla vista MyCompound, proprio come fai con qualsiasi visualizzazione standard.

Problemi correlati