46

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

4

6 に答える 6

22

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

DialogFragmentはonCreateViewではなくonCreateDialogを使用するため、onViewCreatedは起動されません。(私の実用的な理論になるでしょう、私は確認するためにアンドロイドソースに飛び込んでいません)。

于 2012-05-15T06:20:03.953 に答える
11

ソース コードから何が起こっているかを確認できます。

まず、フラグメントのビューをオーバーライドしないため、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;
}
于 2015-11-24T18:15:29.050 に答える
2

ドキュメント(Selecting Between Dialog or Embedding)によると、自分でテストすると、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; 
    }
于 2014-06-03T07:27:09.407 に答える