2016-05-26 2 views
0

Ich habe eine XML-Datei wie dieseBundle bezogenen Ansichten in Widget und Daten füttern

<LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 

     <ImageButton 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:id="@+id/book_dialog_btn" 
      android:src="@drawable/book" 
      android:onClick="showDialog"/> 

     <EditText 
      android:id="@+id/code_field" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:inputType="number" /> 

    </LinearLayout> 

EditText Feld mit einer ganzen Zahl gefüllt werden muss, dass ein Produkt-ID und Benutzer können die Möglichkeiten, in zwei eingeben

  • Benutzer kann entweder klicken sie auf Image, die einen Dialog mit einer Liste öffnet und nach dem Benutzer ein Element auswählen, wird id
  • Benutzer wissen Produkt-ID EditText eingefügt und geben sie es manuell

Diese Bits von XML-Code werden in mehr als eine Tätigkeit zu wiederholen, so gebündelte i in eine kundenspezifische Ansicht wie diese

public class PiceBookCodeField extends LinearLayout{ 

    public PiceBookCodeField (Context context, AttributeSet attr, int defStyle) { 
     super(context, attr, defStyle); 
     init(); 
    } 

    public PiceBookCodeField (Context context, AttributeSet attr) { 
     super(context, attr); 
     init(); 
    } 

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

    private void init() { 

    LinearLayout root = (LinearLayout) inflate(getContext(), R.layout.price_book_code_field, this); 

    } 
} 

und i unten Code verwenden, anstatt in XML

<com.sth.PiceBookCodeField 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

aber ich Ich möchte Textwatcher hinzufügen, um Text zu bearbeiten und wenn Benutzer eine Code-Suchdatenbank eingeben, um zu prüfen, ob Code in der Datenbank existiert. , aber ich lese irgendwo, dass wir keine Daten bezogene Logik in Aussicht stellen müssen, aber wo ich diese Logik schreiben und vermeiden sollte, es

Antwort

0

Textwatcher hinzufügen und starten Sie es async Aufgabe.

Daten suchen, laden, herunterladen usw. alle müssen in async Aufgabe sein. machen Asynchron-Aufgabe durchführen zu suchen und es ist onPostExecute - Änderungen an Ihren Text Ansicht nach Ergebnissen, die Sie bekommen)

+0

ist es eine gute Übung!? Ich habe gelesen, dass wir eine Async-Aufgabe in Hinblick auf die Datenzuführung nicht starten sollten? – ramin

+0

Wird schlecht sein, wenn Sie ohne asynchrone Aufgabe füllen werden –

0

Normalerweise würden Sie Verweise auf Ihr Kind Ansichten erhalten, nach der sie weiter konfigurieren könnt (zB Einstellung OnClickListener s oder TextWatcher s). Sie können in Ihrer Ansicht auch öffentliche Methoden definieren, die Methoden an die untergeordneten Elemente delegieren, um die gewünschten Verhalten zu unterstützen.

public class PiceBookCodeField extends LinearLayout { 
    private ImageView mImageView; 
    private EditText mEditText; 

    /* constructors omitted */ 

    private void init() { 
     LayoutInflater inflater = LayoutInflater.from(getContext()); 
     inflater.inflate(R.layout.price_book_code_field, this, true); 

     mImageView = (ImageView) findViewById(R.id.book_dialog_btn); 
     mEditText = (EditText) findViewById(R.id.code_field); 

     // TODO stuff 
    } 

    // example method 
    public void setCode(String code) { 
     mEditText.setText(code); 
    } 
} 

Eine Sache, die Sinn machen könnte, ist Ihre eigene interface für verschiedene Aktionen der eigenen View unterstützt zu erstellen. Stellen Sie dann in Ihrer init()-Methode die Listener ein, die Sie normalerweise verwenden würden, rufen Sie jedoch Ihre Listener-Schnittstelle auf. Dann jeder Benutzer Ihrer Ansicht kann einfach ein Listener Maßnahme zu ergreifen, soweit zutreffend:

public interface CodeFieldListener { 
    void onCodeBookClick(PiceBookCodeField view); 
    void onCodeEntered(PiceBookCodeField view, String code); 
} 

private CodeFieldListener mCodeFieldListener; 

public void setCodeFieldListener(CodeFieldListener listener) { 
    mCodeFieldListener = listener; 
} 

// inside of init() 
mImageView.setOnClickListener(v -> { 
    if (mCodeFieldListener != null) { 
     mCodeFieldListener.onCodeBookClick(this); 
    } 
}); 

Beachten Sie, dass seit Ihrer benutzerdefinierte Ansicht ist bereits ein Linearlayout, die XML für die Kinder den <merge> Tag als Wurzel verwenden kann statt <LinearLayout>:

<merge> 
    <ImageButton 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:id="@+id/book_dialog_btn" 
     android:src="@drawable/book" /> 

    <EditText 
     android:id="@+id/code_field" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:inputType="number" /> 
</merge> 

diese Weise die endgültige Hierarchie Ihrer benutzerdefinierten Ansicht ist

PiceBookCodeField 
    ImageView 
    EditText 

statt

PiceBookCodeField 
    LinearLayout 
     ImageView 
     EditText 
+0

Eigentlich habe ich diese Sachen in meiner init-Methode, z. B. Einstellung Text-Watcher und so weiter. Ich möchte nur wissen, wo ich meine Desinfektionslogik diese Abfrage-Datenbank setzen sollte?Jetzt habe ich Loader-Manager, dass Abfrage DB, aber das ist in mehreren Aktivitäten wiederholt und ich möchte es an einem Ort schreiben und wiederverwenden – ramin

+0

@ramin Sie könnten eine Standard-Implementierung dieser Schnittstelle schreiben, die diese Arbeit macht, und dann überall Sie wollen dies Verhalten, instanziieren Sie einen von denen. – Karakuri

Verwandte Themen