Domanda

vorrei creare un View personalizzato su Android. Ho cercato di farlo il più semplice possibile e ha creato una classe di MyView quasi vuoto e lo ha utilizzato nel mio LinearLayout ma l'applicazione non riesce a iniziare con "Forza Chiudi". Come posso fare un semplice View personalizzato? Secondo costruzione componenti personalizzati il View ottiene la dimensione 100x100, se non a ignorare onMeasure().

public class MyView extends View {

    public MyView(Context context) {
        super(context);
    }
}

E lo uso in un LinearLayout con:

<view
    class="com.example.MyView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="0.0" />

Che cosa sto facendo di sbagliato?


Se uso il costruttore che itemon suggerire e il corrispondente chiamata alla superclasse. Poi la "Forza Chiudi" è andato, ma la mia LinearLayout è rotto, i componenti dopo MyView non viene visualizzato.

Ecco la mia main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    >
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="0.0"
    android:background="#f00"
    android:text="Hello"
/>
<view
    class="com.example.MyView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="0.0"
/>
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="0.0"
    android:background="#00f"
    android:text="World"
/>
</LinearLayout>
È stato utile?

Soluzione

può essere si potrebbe definire un altro metodo di costruzione in questo modo:

public MyView(Context context, AttributeSet attrs)

il quadro Android cercherà di costruire l'interfaccia utente con la vista dal costruttore sopra.

Altri suggerimenti

La Guida per gli sviluppatori Android ha una sezione chiamata costruzione componenti personalizzati. Purtroppo, la discussione di attributi XML solo i coperchi dichiarano il controllo all'interno del file di layout e non trattare materialmente i valori all'interno della classe di inizializzazione. I passi sono i seguenti:

Declare attributi nei valori \ attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyCustomView">
        <attr name="android:text"/>
        <attr name="android:textColor"/>            
        <attr name="extraInformation" format="string" />
    </declare-styleable>
</resources>

Si noti l'uso di un nome non qualificato nel tag dichiarare-styleable. attributi androide non standard come extraInformation bisogno di avere il loro tipo dichiarato. Tag dichiarati nella superclasse saranno disponibili in sottoclassi, senza dover essere dichiarato nuovamente.

Crea costruttori

Dal momento che ci sono due costruttori che utilizzano un AttributeSet per l'inizializzazione, è conveniente per creare un metodo di inizializzazione separata per i costruttori di chiamata.

private void init(AttributeSet attrs){  
    TypedArray a=getContext().obtainStyledAttributes(attrs,R.styleable.MyCustomView);
    //Use a
    Log.i("test",a.getString(R.styleable.MyCustomView_android_text));
    Log.i("test",""+a.getColor(R.styleable.MyCustomView_android_textColor, Color.BLACK));
    Log.i("test",a.getString(R.styleable.MyCustomView_android_extraInformation));
    //Don't forget this
    a.recycle();
}

R.styleable.MyCustomView è una risorsa int generato automaticamente [] in cui ogni elemento è l'ID di un attributo. Gli attributi vengono generate per ogni proprietà in XML aggiungendo il nome attributo per il nome dell'elemento. Gli attributi possono essere recuperati dal TypedArray utilizzando diverse funzioni get. Se l'attributo non è definito in XML, viene restituito NULL. Tranne, naturalmente, se il tipo di ritorno è un primitivo, nel qual caso viene restituito il secondo argomento.

Se non si desidera recuperare tutti gli attributi, è possibile creare questo array manually.The ID per gli attributi standard di Android sono inclusi nel android.R.attr, mentre gli attributi per questo progetto sono in R.attr .

int attrsWanted[]=new int[]{android.R.attr.text, R.attr.textColor};

Si prega di notare che non si dovrebbe usare qualsiasi cosa in android.R.styleable, come da questa discussione potrebbe cambiare in futuro. E 'ancora nella documentazione come per visualizzare tutte queste costanti in un unico luogo è utile.

Usa in un layout di file come il layout \ main.xml Includere la dichiarazione dello spazio dei nomi

  

xmlns: app = "http://schemas.android.com/apk/res/com.mycompany.projectname"

nell'elemento di livello superiore xml.

<com.mycompany.projectname.MyCustomView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@android:color/transparent"
    android:text="Test text"
    android:textColor="#FFFFFF"
app:extraInformation="My extra information";
/> 

Riferimento visualizzazione personalizzata utilizzando il nome completo.

  

LabelView Android Esempio

Se volete un esempio completo, sguardo al campione di Android vista etichetta.

LabelView.java

TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.LabelView);
CharSequences=a.getString(R.styleable.LabelView_text);
attrs.xml

<declare-styleable name="LabelView">
    <attr name="text"format="string"/>
    <attr name="textColor"format="color"/>
    <attr name="textSize"format="dimension"/>
</declare-styleable>

custom_view_1.xml

<com.example.android.apis.view.LabelView
    android:background="@drawable/blue"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    app:text="Blue"app:textSize="20dp"/>

Questa è contenuta in un LinearLayout con un attributo namespace:

  

xmlns: app = "http://schemas.android.com/apk/res/com.example.android.apis"

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top