2011-04-19 9 views
15

Soy muy nuevo en Android y estoy tratando de cargar/persistir los valores de mi DialogPreference personalizado. Actualmente, esto falla porque findViewById devuelve null. ¿Es la forma en que (intento) de hacerlo correcto? ¿Cómo obtengo acceso a mis widgets EditText en el código?¿Cómo acceder a widgets en un DialogPreference personalizado con un diseño inflado?

public class AddressDialogPreference extends DialogPreference { 

public AddressDialogPreference(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    setDialogLayoutResource(R.layout.address_dialog); 
} 

@Override 
protected void onBindDialogView(View view) { 

    EditText idField = (EditText) view.findViewById(R.id.hostID); 
    EditText ipField = (EditText) view.findViewById(R.id.hostIP); 

    SharedPreferences pref = getSharedPreferences(); 
    idField.setText(pref.getString(getKey() + "_id","ExampleHostname")); 
    ipField.setText(pref.getString(getKey() + "_ip","192.168.1.1")); 

    super.onBindDialogView(view); 
} 

@Override 
protected void onDialogClosed(boolean positiveResult) { 

    if(!positiveResult) 
     return; 

    Dialog myDial = getDialog(); 
    EditText idField = (EditText) myDial.findViewById(R.id.hostID); 
    EditText ipField = (EditText) myDial.findViewById(R.id.hostIP); 

    SharedPreferences.Editor editor = getEditor(); 
    editor.putString(getKey() + "_id",idField.getText().toString()); 
    editor.putString(getKey() + "_ip",ipField.getText().toString()); 
} 

address_dialog.xml:

<TextView 
    android:text="Insert IP address" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" /> 
<EditText 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/hostIP" /> 

<TextView 
    android:text="Insert identifier" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" /> 
<EditText 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/hostID" /> 

+0

No debe utilizar letras mayúsculas dentro de las identificaciones en XML (como 'hostID') –

Respuesta

21

Ok me pareció a mí mismo. Bueno, todavía no sé qué causó el error, pero hice muchos cambios en el diseño y el código y de repente funcionó. Traté de volver al código que publiqué aquí, pero no puedo reproducir el error. Estoy publicando mi código de trabajo, para que cualquiera que se encuentre con este problema, pueda usarlo.

Un administrador también puede optar por eliminar esta publicación, ya que puede que no sea posible reproducir el error.

Este es el diagrama:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical"> 

<TextView 
    android:text="Insert IP address" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" /> 
<EditText 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/AddressBox" /> 

<TextView 
    android:text="Insert identifier" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" /> 
<EditText 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/HostnameBox" /> 
</LinearLayout> 

y la AddressDialogPreference.java:

public class AddressDialogPreference extends DialogPreference { 

private EditText ipBox; 
private EditText hostBox; 

public AddressDialogPreference(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    setDialogLayoutResource(R.layout.address_dialog); 
} 

@Override 
protected void onBindDialogView(View view) { 

    ipBox = (EditText) view.findViewById(R.id.AddressBox); 
    hostBox = (EditText) view.findViewById(R.id.HostnameBox); 

    SharedPreferences pref = getSharedPreferences(); 

    hostBox.setText(pref.getString(getKey() + "_host","ExampleHostname")); 
    ipBox.setText(pref.getString(getKey() + "_ip","192.168.1.1")); 

    super.onBindDialogView(view); 
} 

@Override 
protected void onDialogClosed(boolean positiveResult) { 

    if(!positiveResult) 
     return; 

    SharedPreferences.Editor editor = getEditor(); 
    editor.putString(getKey() + "_host",hostBox.getText().toString()); 
    editor.putString(getKey() + "_ip",ipBox.getText().toString()); 
    editor.commit(); 

    super.onDialogClosed(positiveResult); 
} 
} 
Cuestiones relacionadas