从DialogFragment中获取视图

10

我这样实现了一个对话框片段:

public class ProgressFragment extends DialogFragment {

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    View v = getActivity().getLayoutInflater().inflate(R.layout.installation_page, null);
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    titleView = (TextView) v.findViewById(R.id.progressText);
    titleView.setText("progress");
    builder.setView(v);
    return builder.create();
}

 TextView titleView;

public TextView getTextView() {
    return titleView;
}

我希望能够从任何地方更新 titleView 的内容。例如:

ProgressFragment progressFragment = new ProgressFragment();
progressFragment.show(getSupportFragmentManager(),"");

问题是试验者喜欢:
((TextView)progressFragment.getDialog().findViewById(R.id.progressText)).setText("text");

并且

progressFragment.getTextView().setText("text");

并且

((TextView)progressFragment.getView().findViewById(R.id.progressText)).setText("working in this place");

所有返回值都为null。我该怎么做?谢谢。
4个回答

3
不!不!不!如果你使用以下代码创建DialogFragment:

 `Dialog onCreateDialog(Bundle savedInstanceState)`

(你的视图已经失效了),因为你是用对话框(Dialog)创建的而不是

public View onCreateView(LayoutInflater inflater,ViewGroup
               container,Bundle savedInstanceState) {

看了你的代码,我建议你使用第二种方法创建DialogFrament,因为你只是返回一个TextView cheese

但如果你坚持使用你的方法,那么你的解决方案会更加冗长。

progressFragment.getDialog().getWindow().getDecorView()

DecorView可能是您的TextView,但我不确定。总体来说:

 progressFragment.getDialog().getWindow().findViewById();

视图并非消失,而是添加到警示对话框中。只是在以后的时间里很难获取对它的引用。这就是为什么如果您想要在以后的时间修改根视图中的任何内容,您应该在片段中保留对其的引用,并在从onCreateDialog()方法返回之前将其分配给该引用。在这种情况下,他只修改了文本视图,因此可以引用文本视图。 - Sarah Multitasker

2

我不太确定这是否是一个好的做法,但我使用回调函数进行了修复。

 public interface dialogViewCallBack {
    void onViewLoaded(TextView textView);
}

static dialogViewCallBack dialogViewCallBack;

public ProgressFragment progressFragment(dialogViewCallBack callBack) {
    dialogViewCallBack = callBack;
    return new ProgressFragment();
}

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    View v = getActivity().getLayoutInflater().inflate(R.layout.installation_page, null);
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    TextView titleView = (TextView) v.findViewById(R.id.progressText);
    titleView.setText("progress");
    builder.setView(v);
    dialogViewCallBack.onViewLoaded(titleView);
    return builder.create();
}

因此,在调用progressFragment的类中,我只需执行以下操作:
public class TestActivity extends AppCompatActivity implements ProgressFragment.dialogViewCallBack {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ProgressFragment progressFragment = new ProgressFragment().progressFragment(this);
    progressFragment.show(getSupportFragmentManager(),"");

}

@Override
public void onViewLoaded(TextView textView) {
    // can assign the view to another view here.
    textView.setText("working here");
}
}

1
在对话框片段中创建一个文本视图的setter方法。
public void setTextView(String str) {
   titleView.setText(str);
}

并调用

ProgressFragment progressFragment = new ProgressFragment();
progressFragment.show(getSupportFragmentManager(),"");
progressFragment.setTextView("title");

这意味着您的TextView为空。 - Amarjit
TextView 不为空,因为它在 onCreateDialog 中被看到。 - Belvi Nosakhare

0
 override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    return activity?.let {
        val builder = AlertDialog.Builder(it)
        // Get the layout inflater
        val inflater = requireActivity().layoutInflater;

        // get custom layout view
        val view = inflater.inflate(R.layout.edit_text_dialog, null)
        // Inflate and set the layout for the dialog
        // Pass null as the parent view because its going in the dialog layout
        builder.setView(view)
                // Add action buttons
                .setPositiveButton(R.string.ok,
                        DialogInterface.OnClickListener { dialog, id ->
                            // sign in the user ...
                            val editText = view.findViewById<EditText>(R.id.channelName)
                            Toast.makeText(activity, editText.text.toString(), Toast.LENGTH_SHORT).show()

                        })
                .setNegativeButton(R.string.cancel,
                        DialogInterface.OnClickListener { dialog, id ->
                            getDialog()?.cancel()
                        })
        builder.create()
    } ?: throw IllegalStateException("Activity cannot be null")
}

在Java问题上回复Kotlin非常粗鲁。而且Kotlin已经死了。 - CaptainCrunch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接