如何使用膨胀布局访问自定义DialogPreference中的小部件?

林非常新的android和Im试图加载/持久化我的自定义DialogPreference的值。 目前,这失败了,因为findViewById返回null。 我(尝试)做的方式是正确的吗? 如何在代码中访问我的EditText小部件?

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" /> 

  • 如何在PreferenceScreen中更改字体大小
  • 在AppWidget提供程序中获取首选项
  • PreferenceFragment读/写哪个设置文件?
  • PreferenceScreen中的TimePicker
  • android:如何使设置导航像本地设置的应用程序
  • 当其他首选项被禁用时,如何在我的Android应用程序中启用首选项?
  • 如何使用膨胀布局访问自定义DialogPreference中的小部件?
  • PreferenceActivity和主题不适用
  • 好吧,我自己find了。 那么,我仍然不知道是什么导致了这个错误,但是我对布局和代码做了很多改变,突然之间就发生了变化。 我试图恢复到我在这里发布的代码,但我不能重现错误。 我张贴我的工作代码,所以遇到这个问题的任何人,可能会使用它。

    pipe理员也可以select删除这篇文章,因为它可能无法重现错误。

    这是布局:

     <?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); } }