web-dev-qa-db-ja.com

Android DialogFragment onViewCreatedが呼び出されていません

私は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がログに記録されません。

29
Gaurav Vashisth

さて、onViewCreated状態のドキュメントは、「onCreateView(LayoutInflater、ViewGroup、Bundle)が戻った直後に呼び出されました」という状態です。

DialogFragmentはonCreateDialogではなくonCreateDialogを使用するため、onViewCreatedは発生しません。 (私の理論では、Android確認のための出典)には触れていません。

17
Barak

私のテストでは、onCreateViewがデフォルトの動作であるnullを返す場合、onViewCreatedは呼び出されません。したがって、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"があることを確認してください

8
vinc3m1

あなたはソースコードから何が起こっているかを見ることができます:

まず、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であるため、FragmentManageronViewCreated()を呼び出しません。 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;
}
_
6
bcorso

ドキュメント( ダイアログまたは埋め込みの選択 )に従って自分でテストすると、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; 
    }
2
diferno

これは、onViewCreatedがkotlinで呼び出されるようにする方法です。

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!
    }
}
0