2011-04-19 48 views
15

我非常新的android和Im試圖從我的自定義DialogPreference加載/持久值。目前,這失敗了,因爲findViewById返回null。我(嘗試)做的方式是否正確?如何在代碼中訪問我的EditText小部件?如何使用膨脹版式訪問自定義DialogPreference中的小部件?

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

不得使用內部IDS大寫字母在XML(比如'hostID') – 2011-06-24 09:38:31

回答

21

好吧,我發現它自己。那麼,我仍然不知道是什麼導致了這個錯誤,但是我對佈局和代碼做了很多改變,並且突然它就起作用了。我試圖恢復到我在這裏發佈的代碼,但我無法重現該錯誤。我張貼我的工作代碼,所以遇到這個問題的任何人都可以使用它。

管理員也可能選擇刪除此帖子,因爲它可能無法重現錯誤。

這裏的佈局:

<?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> 

和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); 
} 
} 
相關問題