In Android Honeycomb wurden erstmals Fragments vorgestellt. Mit Fragments lassen sich Activitys parallel auf einem Tablet steuern.Durch Fragments wurden auch die altbekannten Dialoge ersetzt, nämlich durch DialogFragments. In diesem Beitrag möchte ich aufzeigen, wie DialogFragments mittels der v4 support library funktionieren.Die v4 support library wird dazu benutzt, um ältere Android-Versionen zu unterstützen (<= Honeycomb). Das nachfolgende Beispiel zeigt ein einfaches edit dialog und gibt das Ergebnis zu der aufrufenden Activity weiter.
Das Layout
Zuerst erstellen wir das Layout für das dialog und nennen es wie folgt: fragment_edit_name.xml
|
1 |
<code><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/edit_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:orientation="vertical" > <TextView android:id="@+id/lbl_your_name" android:text="Your name" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <EditText android:id="@+id/txt_your_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType=”text” android:imeOptions="actionDone" /> </LinearLayout></code> |
[important] Das verwenden des Attributs android:imeOptions=”actionDone” zusammen mit android:inputType=”text” lässt den Done-Key anstatt des Enter-Buttons zeigen. [/important]
Dialog Code
Die Klasse dialog stammt von DialogFragment ab. Da wir jedoch noch die Kompatibilität für die älteren Android-Versionen hinzufügen möchten, benötigen wir das v4 support library.
|
1 |
<code>import android.support.v4.app.DialogFragment; // ... public class EditNameDialog extends DialogFragment { private EditText mEditText; public EditNameDialog() { // Empty constructor required for DialogFragment } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_edit_name, container); mEditText = (EditText) view.findViewById(R.id.txt_your_name); getDialog().setTitle("Hello"); return view; } }</code> |
Dialog anzeigen
Jetzt benötigen wir noch ein wenig Code um das Dialogfeld zu zeigen.Nach dem starten öffnet sich sofort das Dialogfeld in dessen man seinen Namen eingeben kann. Danach wird der eingegebene Name in einem Toast eingeblendet.
|
1 |
<code>import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; // ... public class FragmentDialogDemo extends FragmentActivity implements EditNameDialogListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); showEditDialog(); } private void showEditDialog() { FragmentManager fm = getSupportFragmentManager(); EditNameDialog editNameDialog = new EditNameDialog(); editNameDialog.show(fm, "fragment_edit_name"); } @Override public void onFinishEditDialog(String inputText) { Toast.makeText(this, "Hi, " + inputText, Toast.LENGTH_SHORT).show(); } }</code> |
Da wir für den oberen Code die v4 support library verwenden,schreiben wir Activity extends FragmentActivity. Deshalb auch der Aufruf der Methode getSupportFragmentManager(), anstatt getFragmentManager().
DialgFragment erweitern
|
1 |
<code>import android.support.v4.app.DialogFragment; // ... public class EditNameDialog extends DialogFragment implements OnEditorActionListener { public interface EditNameDialogListener { void onFinishEditDialog(String inputText); } private EditText mEditText; public EditNameDialog() { // Empty constructor required for DialogFragment } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_edit_name, container); mEditText = (EditText) view.findViewById(R.id.txt_your_name); getDialog().setTitle("Hello"); // Show soft keyboard automatically mEditText.requestFocus(); getDialog().getWindow().setSoftInputMode( LayoutParams.SOFT_INPUT_STATE_VISIBLE); mEditText.setOnEditorActionListener(this); return view; } @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (EditorInfo.IME_ACTION_DONE == actionId) { // Return input text to activity EditNameDialogListener activity = (EditNameDialogListener) getActivity(); activity.onFinishEditDialog(mEditText.getText().toString()); this.dismiss(); return true; } return false; } }</code> |
Für die bessere Benutzerführung fügen wir die Methode mEditText.requestFocus()hinzu. Damit erreichen wir, dass die Tastatur aufspringt, wenn der Benutzer auf das Input-Feld klickt bzw. tippt. Zwar hätten wir das direkt in unserem Layout-Manifest regeln können – jedoch ist eine Steuerung über den Programmcode komfortabler, da z.B. ein Aufruf der Methode onFocusChangeListener innerhalb von onCreateView() eines Fragments die Tastatur nicht anzeigen könnte. Daher ist es ratsam, das oben genannte Beispiel zu verwenden.
Es hat mich viel geholfen Danke