Android DialogFragment onViewCreated未调用

android android-support-library android-dialogfragment

16162 观看

5回复

4238 作者的声誉

我正在使用android兼容性库(v4版本8)。在自定义DialogFragment中,未调用重写的onViewCreated方法。

public class MyDialogFragment extends DialogFragment{
    private String mMessage;
    public MyDialogFragment(String message) {
        mMessage = message;
    }

    @Override
    public Dialog onCreateDialog( Bundle savedInstanceState){
        super.onCreateDialog(savedInstanceState);
        Log.d("TAG", "onCreateDialog");
        setRetainInstance(true); 
        //....do something
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        Log.d("TAG", "onViewCreated");
        //...do something
    }
}

onViewCreated没有得到记录。

作者: Gaurav Vashisth 的来源 发布者: 2012 年 5 月 15 日

回应 5


17

15454 作者的声誉

好吧,onViewCreated状态的文档“在onCreateView(LayoutInflater,ViewGroup,Bundle)返回后立即调用”。

DialogFragment使用onCreateDialog而不是onCreateView,因此不会触发onViewCreated。(将是我的工作理论,我没有深入研究android来确认)。

作者: Barak 发布者: 2012 年 5 月 15 日

8

3785 作者的声誉

从我的测试,onViewCreated不叫,如果onCreateView返回null,这是默认行为,所以如果你不使用onCreateView但手动调用setContentViewonCreateDialog,你可以手动调用onViewCreated来自onCreateDialog

@Override public Dialog onCreateDialog(Bundle savedInstanceState) {
    final Dialog d = super.onCreateDialog(savedInstanceState);
    d.setContentView(R.layout.my_dialog);
    // ... do stuff....
    onViewCreated(d.findViewById(R.id.dialog_content), savedInstanceState);
    return d;
}

在这种情况下,请确保其中的根元素my_dialog.xml具有android:id="@+id/dialog_content"

作者: vinc3m1 发布者: 2014 年 2 月 24 日

2

86 作者的声誉

根据文档(在对话框之间选择还是嵌入)并由我自己对其进行测试,您可以覆盖OnCreateView,使用自定义布局将其填充并返回。OnViewCreated将启动

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
           View view = inflater.inflate(R.layout.custom_layout, null);
           //do whatever        
           return view; 
    }
作者: diferno 发布者: 2014 年 6 月 3 日

6

31914 作者的声誉

您可以从源代码中看到正在发生的事情:

首先,由于不覆盖,因此onCreateView()片段的视图为null。从源代码Fragment可以看出-默认返回null

// android.support.v4.app.Fragment.java
@Nullable
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
        @Nullable Bundle savedInstanceState) {
    return null;
}

其次,由于您认为null为空,FragmentManager因此不会调用onViewCreated()。从的源代码FragmentManager

// android.support.v4.app.FragmentManager.java
if (f.mView != null) {
    f.mInnerView = f.mView;
    // ... 

    // only called if the fragments view is not null!
    f.onViewCreated(f.mView, f.mSavedFragmentState);
} else {
    f.mInnerView = null;
}
作者: bcorso 发布者: 2015 年 11 月 24 日

0

825 作者的声誉

这就是我确保在kotlin中调用onViewCreated的方式:

class MyDialog: DialogFragment() {

    private lateinit var dialogView: View

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        dialogView = LayoutInflater.from(context).inflate(R.layout.dialog, null)
        val dialog = MaterialAlertDialogBuilder(context!!)
                .setView(dialogView)
                .create()

        return dialog
    }

    // Need to return the view here or onViewCreated won't be called by DialogFragment, sigh
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return dialogView
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        // Yay it's now called!
    }
}
作者: Carson Holzheimer 发布者: 2019 年 9 月 5 日
32x32