从另一个 activity 访问 DialogFragment 视图
Accessing DialogFragment Views from another activity
我有一个 class 扩展 DialogFragment
,它使用布局充气器显示不同的视图
public class MyDialog extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState){
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater layoutInflater = getActivity().getLayoutInflater();
builder.setView(layoutInflater.inflate(R.layout.dialog_pin_layout,null))
.setTitle("Enter info")
...
return builder.create();
}
布局仅包含一个 EditText
:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/infoEdit" />
</RelativeLayout>
现在我正在尝试从我的 MainActivity
中自动填充此 EditText
//When the user clicks on the button in the main activity, prompt MyDialog
ImageButton usr = (ImageButton)findViewById(R.id.usrImageButton);
usr.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new MyDialog().show(getFragmentManager(),"fragment_info");
//If userInfo exists, fill the DialogFragment's EditText
if(userInfo!=null){
EditText txt = (EditText)findViewById(R.id.infoEdit);
txt.setText(userInfo.toString());
}
}
});
当我 运行 应用程序时,单击按钮会引发由以下原因引起的 NullPointerException:txt.setText(userInfo.toString());
。
通过使用调试器,我发现 (EditText)findViewById(R.id.infoEdit)
returns null
,我想我无法使用 findViewById
访问 MainActivity 中的 EditText 视图。有办法吗?
您最好的选择是将字符串传递给 DialogFragment 并像这样设置它:
public class MyDialog extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState){
Bundle args = getArguments();
String text = args.getString("TEXT_TO_SET");
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater layoutInflater = getActivity().getLayoutInflater();
View view = layoutInflater.inflate(R.layout.dialog_pin_layout,null);
EditText txt = (EditText) view.findViewById(R.id.infoEdit);
txt.setText(text);
builder.setView(view)
.setTitle("Enter info")
...
return builder.create();
}
并且在创建 DialogFragment 时将额外的传递给它:
DialogFragment fragment = new MyDialog();
Bundle bundle = new Bundle();
bundle.putString("TEXT_TO_SET",userInfo.toString());
fragment.setArguments(bundle);
fragment.show(getFragmentManager(),"fragment_info");
我有一个 class 扩展 DialogFragment
,它使用布局充气器显示不同的视图
public class MyDialog extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState){
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater layoutInflater = getActivity().getLayoutInflater();
builder.setView(layoutInflater.inflate(R.layout.dialog_pin_layout,null))
.setTitle("Enter info")
...
return builder.create();
}
布局仅包含一个 EditText
:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/infoEdit" />
</RelativeLayout>
现在我正在尝试从我的 MainActivity
中自动填充此EditText
//When the user clicks on the button in the main activity, prompt MyDialog
ImageButton usr = (ImageButton)findViewById(R.id.usrImageButton);
usr.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new MyDialog().show(getFragmentManager(),"fragment_info");
//If userInfo exists, fill the DialogFragment's EditText
if(userInfo!=null){
EditText txt = (EditText)findViewById(R.id.infoEdit);
txt.setText(userInfo.toString());
}
}
});
当我 运行 应用程序时,单击按钮会引发由以下原因引起的 NullPointerException:txt.setText(userInfo.toString());
。
通过使用调试器,我发现 (EditText)findViewById(R.id.infoEdit)
returns null
,我想我无法使用 findViewById
访问 MainActivity 中的 EditText 视图。有办法吗?
您最好的选择是将字符串传递给 DialogFragment 并像这样设置它:
public class MyDialog extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState){
Bundle args = getArguments();
String text = args.getString("TEXT_TO_SET");
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater layoutInflater = getActivity().getLayoutInflater();
View view = layoutInflater.inflate(R.layout.dialog_pin_layout,null);
EditText txt = (EditText) view.findViewById(R.id.infoEdit);
txt.setText(text);
builder.setView(view)
.setTitle("Enter info")
...
return builder.create();
}
并且在创建 DialogFragment 时将额外的传递给它:
DialogFragment fragment = new MyDialog();
Bundle bundle = new Bundle();
bundle.putString("TEXT_TO_SET",userInfo.toString());
fragment.setArguments(bundle);
fragment.show(getFragmentManager(),"fragment_info");