Frage

Ich versuche zu verlängern Spinner Android -Klasse in meinem Code, um eine neue Funktion zu implementieren, aber aus irgendeinem Grund funktionierte dies nicht.

Dies ist die erweiterte Klasse:

import android.content.Context;
import android.widget.AdapterView;
import android.widget.Spinner;

public class CustomSpinner extends Spinner {

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

    public void setSelectionByItemId(AdapterView<?> parent, long id){
        for (int i = 0; i < parent.getCount(); i++) {              
            long itemIdAtPosition = parent.getItemIdAtPosition(i);
            if (itemIdAtPosition == id) {
                parent.setSelection(i);
                break;
            }
        }
    }
}

Und so bin ich diese Klasse instanziiert:

CustomSpinner spinner = (CustomSpinner) findViewById(R.id.sphofentries);

Dies gibt mir einen Fehler zur Laufzeit.

All dies ist wenn R.id.sphofentries wird in meinem Layout als Spinner deklariert.

Aber jetzt, wenn ich erkläre sphofentries Als ein CustomSpinner Ich erhalte einen Laufzeitfehler gerade im Moment, in dem ich das Layout auf die Aktivität festlegt:

setContentView(R.layout.settings);

Ich bin mir auch ziemlich sicher, dass das Problem darin besteht, dass ich deklarieren muss sphofentries Als ein CustomSpinner Denn wenn ich das mache:

CustomSpinner spinner = new CustomSpinner(this);
spinner = (CustomSpinner) findViewById(R.id.sphofentries);

Dies gilt ohne Probleme durch die erste Zeile, gibt jedoch einen Laufzeitfehler in der zweiten CustomSpinner aber einstellen die sphofentries in diesem CustomSpinner (Dies mit sphofentries deklariert wie a Spinner kein CustomSpinner).

Vielleicht mache ich im Layout etwas falsch, so erkläre ich so sphofentries Als ein CustomSpinner:

<CustomSpinner 
    android:id="@+id/sphofentries"
    android:layout_below="@+id/tvhofentries"
    android:layout_width="300dip"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
/>
War es hilfreich?

Lösung

Schließlich gab es zwei Gründe dafür, nicht ordnungsgemäß zu funktionieren. Die beiden früheren Antworten sind richtig:

  1. Es ist notwendig, auch den zweiten Konstruktor mit dem Attributeet -Parameter zu definieren.

    public CustomSpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
    
  2. Im Layout muss der Spinner als Customspinner definiert werden und muss mit allen voll qualifizierten Namen deklariert werden:

    <net.domain.package.CustomSpinner  
        android:id="@+id/sphofentries" 
        android:layout_below="@+id/tvhofentries"
        android:layout_width="300dip"       
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
    />
    

Andere Tipps

Es ist ein häufiger Fehler. Fügen Sie einfach diesen Konstruktor hinzu, der vom Layout -Inflater genannt wird:

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

Ist SphoFentries a Spinner oder ein CustomSpinner?

Es müsste als als deklariert werden CustomSpinner In Ihrem Layout, damit Sie es als wir uns aufsetzen können CustomSpinner in Ihrem Code.

Der andere Weg würde funktionieren. Sie könnten in der Lage sein, a zu werfen CustomSpinner Als ein Spinner, weil es eine Unterklasse ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top