Domanda

sto imparando sull'utilizzo Visualizzazioni personalizzate dal seguente:

http://developer.android.com/guide/ argomenti / ui / custom-components.html # modifica

La descrizione dice:

  

Classe di inizializzazione Come sempre, il   Super è chiamato per primo. Inoltre,   questo non è un costruttore di default, ma   un parametrizzato uno. L'EditText è   creati con questi parametri quando si   è gonfiato da un file di layout XML,   in tal modo, il nostro costruttore ha bisogno di entrambi   prenderli e li passa al   costruttore della superclasse pure.

C'è una descrizione migliore? Ho cercato di capire che cosa il costruttore (s) dovrebbe essere simile e mi è venuta in mente 4 scelte possibili (vedi esempio alla fine del post). Non sono sicuro di quello che queste 4 scelte fanno (o non fanno), perché li ho, o che cosa significano i parametri dovrebbero attuare. C'è una descrizione di questi?

public MyCustomView()
{
    super();
}

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

public MyCustomView(Context context, AttributeSet attrs)
{
    super(context, attrs);
} 

public MyCustomView(Context context, AttributeSet attrs, Map params)
{
    super(context, attrs, params);
} 
È stato utile?

Soluzione

Non è necessario il primo, come che proprio non funziona.

Il terzo vorrà dire la tua View personalizzato sarà utilizzabile da file di layout XML. Se non si cura di questo, non hai bisogno di esso.

Il quarto è solo sbagliato, per quanto ne so. Non v'è alcun costruttore View che prendere un Map come terzo parametro. C'è uno che prende un int come terzo parametro, utilizzato per ignorare lo stile predefinito per il widget.

Io tendo ad usare la sintassi this() di combinare questi:

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

public ColorMixer(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public ColorMixer(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    // real work here
}

È possibile vedere il resto di questo codice questo esempio prenotare .

Altri suggerimenti

Ecco un mio modello (la creazione di un ViewGoup personalizzato qui, ma ancora):

// CustomView.java

public class CustomView extends LinearLayout {

    public CustomView(Context context) {
        super(context);
        init(context);
    }

    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public CustomView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }

    private void init(Context ctx) {
        LayoutInflater.from(ctx).inflate(R.layout.view_custom, this, true);
            // extra init
    }

}

e

// view_custom.xml

<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Views -->
</merge>

Quando si aggiunge il vostro View personalizzato dal xml come:

 <com.mypack.MyView
      ...
      />

sarà necessario il costruttore pubblico MyView(Context context, AttributeSet attrs), altrimenti si otterrà un Exception quando tenta Android al inflate vostro View.

E quando si aggiunge il View da xml e anche Specifica il android:style attribute come:

 <com.mypack.MyView
      style="@styles/MyCustomStyle"
      ...
      />

sarà necessario anche il terzo costruttore pubblico MyView(Context context, AttributeSet attrs,int defStyle).

Il terzo costruttore viene di solito utilizzato quando si estende uno stile e personalizzare, e poi si desidera impostare che style a un dato View nei vostri layout

Modifica dettagli

public MyView(Context context, AttributeSet attrs) {
            //Called by Android if <com.mypack.MyView/> is in layout xml file without style attribute.
            //So we need to call MyView(Context context, AttributeSet attrs, int defStyle) 
            // with R.attr.customViewStyle. Thus R.attr.customViewStyle is default style for MyView.
            this(context, attrs, R.attr.customViewStyle);
    }

Vai a questa

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