私は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がログに記録されません。
さて、onViewCreated状態のドキュメントは、「onCreateView(LayoutInflater、ViewGroup、Bundle)が戻った直後に呼び出されました」という状態です。
DialogFragmentはonCreateDialogではなくonCreateDialogを使用するため、onViewCreatedは発生しません。 (私の理論では、Android確認のための出典)には触れていません。
私のテストでは、onCreateViewがデフォルトの動作であるnullを返す場合、onViewCreated
は呼び出されません。したがって、onCreateViewを使用せず、setContentView
でonCreateDialog
を手動で呼び出す場合、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"
があることを確認してください
あなたはソースコードから何が起こっているかを見ることができます:
まず、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;
}
_
ドキュメント( ダイアログまたは埋め込みの選択 )に従って自分でテストすると、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;
}
これは、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!
}
}