FragmentActivity
から、アクションバーのアクションボタンをクリックしたときにダイアログを表示するDialogFragment
-タイトルのないダイアログTabHost
-ダイアログ上部のタブViewPager
とFragmentPagerAdapter
-Swipable、タブに接続されているコンテンツViewPager
のFragment
の1つに配置することは想定されていません。つまり、Fragment
がViewPager
の表示に関係なく、同じボタンがダイアログの下部に残る必要があります。_IllegalStateException: Fragment does not have a view
_
Android.support.v4
_パッケージを使用するgetChildFragmentManager()
の代わりにgetSupportedFragmentManager()
を呼び出すFragment
が表示していると思われる2つのViewPager
クラスと、DialogFragment
クラスにコードを直接コピー/貼り付けます。DialogFragment
では、最初にonCreateView
をオーバーライドし、次にonCreateDialog
をオーバーライドしてから、両方を同時にオーバーライドしようとしました。これらすべてを実行する必要がありましたが、予期しない結果が発生しました。onCreateView
のみ:_AlertDialog.Builder
_に到達できず、必要なボタンを作成できません。onCreateDialog
のみ:上記のエラーメッセージ。私は、この方法が自分が達成したいものに近づいたのと同じくらい近いとまだ想像しています。onCreateView
とonCreateDialog
の両方:onCreateView
のダイアログレイアウトを拡張し、onCreateDialog
の_AlertDialog.Builder
_にダイアログボタンを追加しました。これによりダイアログが表示されましたが、_AlertDialog.Builder
_から追加されたボタンは表示されませんでした。さらに、EditText
フィールドをクリックしてもキーボードが表示されませんでした。ほとんどはから来ていますAndroid 2.2 + ViewPager and Fragments。ActivityFragment
のコードは、代わりにDialogFragment
にあります。ただし、ViewPagerを、この回答のソースコードからの変更されたものに置き換えましたhttps://stackoverflow.com/a/18167273/2375978。これは、高さを_wrap_content
_にできるようにするためのものでした。
私のプロジェクトの不完全なコードは、DialogFragment
のonCreateDialog
メソッドにあると思います。
_@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), AlertDialog.THEME_HOLO_DARK);
LayoutInflater inflater = getActivity().getLayoutInflater();
view = inflater.inflate(R.layout.dialog_test, null);
addActionButtons(builder, view);
builder.setView(view);
mViewPager = (WrapContentHeightViewPager) view.findViewById(R.id.viewpager);
initialiseTabHost();
List<Fragment> fragments = getFragments();
pageAdapter = new DialogPageAdapter(getChildFragmentManager(), fragments);
mViewPager.setAdapter(pageAdapter);
mViewPager.setOnPageChangeListener(this);
Dialog dialog = builder.create();
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
dialog.show();
return dialog;
}
_
_FATAL EXCEPTION: main
Java.lang.IllegalStateException: Fragment does not have a view
at Android.support.v4.app.Fragment$1.findViewById(Fragment.Java:1425)
at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:901)
at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:1088)
at Android.support.v4.app.BackStackRecord.run(BackStackRecord.Java:682)
at Android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.Java:1444)
at Android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.Java:461)
at Android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.Java:141)
at Android.support.v4.view.ViewPager.populate(ViewPager.Java:1011)
at Android.support.v4.view.ViewPager.populate(ViewPager.Java:880)
at Android.support.v4.view.ViewPager.onMeasure(ViewPager.Java:1374)
at my.app.package.name.WrapContentHeightViewPager.onMeasure(WrapContentHeightViewPager.Java:31)
at Android.view.View.measure(View.Java:15481)
at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5059)
at Android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.Java:1396)
at Android.widget.LinearLayout.measureVertical(LinearLayout.Java:681)
at Android.widget.LinearLayout.onMeasure(LinearLayout.Java:574)
at Android.view.View.measure(View.Java:15481)
at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5059)
at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:310)
at Android.view.View.measure(View.Java:15481)
at Android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.Java:617)
at Android.widget.RelativeLayout.onMeasure(RelativeLayout.Java:399)
at Android.view.View.measure(View.Java:15481)
at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5059)
at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:310)
at Android.view.View.measure(View.Java:15481)
at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5059)
at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:310)
at Android.view.View.measure(View.Java:15481)
at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5059)
at Android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.Java:1396)
at Android.widget.LinearLayout.measureVertical(LinearLayout.Java:681)
at Android.widget.LinearLayout.onMeasure(LinearLayout.Java:574)
at Android.view.View.measure(View.Java:15481)
at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5059)
at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:310)
at Android.view.View.measure(View.Java:15481)
at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5059)
at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:310)
at Android.view.View.measure(View.Java:15481)
at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5059)
at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:310)
at com.Android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.Java:2377)
at Android.view.View.measure(View.Java:15481)
at Android.view.ViewRootImpl.performMeasure(ViewRootImpl.Java:1982)
at Android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.Java:1200)
at Android.view.ViewRootImpl.performTraversals(ViewRootImpl.Java:1398)
at Android.view.ViewRootImpl.doTraversal(ViewRootImpl.Java:1118)
at Android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.Java:4525)
at Android.view.Choreographer$CallbackRecord.run(Choreographer.Java:725)
at Android.view.Choreographer.doCallbacks(Choreographer.Java:555)
at Android.view.Choreographer.doFrame(Choreographer.Java:525)
at Android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.Java:711)
at Android.os.Handler.handleCallback(Handler.Java:615)
at Android.os.Handler.dispatchMessage(Handler.Java:92)
at Android.os.Looper.loop(Looper.Java:137)
at Android.app.ActivityThread.main(ActivityThread.Java:4946)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.jav
_
私はこれと同じ問題に遭遇し、 DialogFragment のソースを見ていくつかのことを学んだと思います。
OnCreateDialog(...)のオーバーライドはカスタムダイアログを作成する有効な方法ですが、エラーメッセージが示すように、DialogFragmentのビューがnullになるように見えます。ほとんどの場合これで問題ありません-DialogFragmentはダイアログを表示するためにビューを必要としませんが、フラグメントをさらにネストしたい場合(そうするように)、これは飛ばないでしょう。
AlertDialog.Builderとやり取りしたいと考えると、私が見ることができる完全なソリューションは実際にはありませんが、いくつかのオプションがあります。
使用
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
onCreateDialog(Bundle savedInstanceState)の代わりに。警告ダイアログを作成せず、メソッドが提供するインフレーターを使用して、ビューを構築します。わたしにはできる。
宜しくお願いします!
それが機能した本当に良い説明を書いてくれた@Tommy Visicに感謝します。
私のために働いたコードを投稿する。
Dialog
ビルドコードをonCreateDialog
メソッドから削除しました実際に削除されたonCreateDialog
メソッドとDialog's
カスタムビューに実装しているダイアログビューこれをView
としてonCreateView
メソッドに含めたところ、すべてが機能し始めました。
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.login_sigup_screen, null, false);
bind = ButterKnife.bind(this, view);
initViewPager();
return view;
}
この実装でもう1つ問題が発生しました。
Activity
にToolbar/ActionBar
が含まれている場合は、DialogFragment
にも表示され、実行されることを回避できます。onViewCreated
メソッドを実装してFragment
とコードの下に追加
Dialog dialog = getDialog();
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
float dimAmount = 0.6f;
dialog.getWindow().setDimAmount(dimAmount);
これにより、Toolbar
がDialogFragment
から削除され、Activity
がそのまま表示されます。
乾杯
ありがとう@Tommy
ゼウスよろしく
onCreateDialog
を実装してAlertDialog
を使用すると、getChildFragmentManager
または同等のものにアクセスするときにIllegalStateException: Fragment does not have a view
にぶつかります。
この問題を解決するには、onCreateDialog
とonCreateView
の両方を実装します。ここで、onCreateView
は、onCreateDialog
で膨張したビューを返します。
class LocationPickerDialog : DialogFragment() {
lateinit var customView: View
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return customView
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
Log.d(TAG, "onCreateDialog")
// StackOverflowError
// customView = layoutInflater.inflate(R.layout.dialog_location_picker, null)
customView = activity!!.layoutInflater.inflate(R.layout.dialog_location_picker, null)
val builder = AlertDialog.Builder(context!!)
.setView(customView)
.setPositiveButton(Android.R.string.ok) { _, _ ->
// do something
}
.setNegativeButton(Android.R.string.cancel) { _, _ ->
// do something
}
val dialog = builder.create()
return dialog
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
// if onCreateView doesn't return a view
// Java.lang.IllegalStateException: Fragment does not have a view
mapFragment = childFragmentManager.findFragmentByTag("map") as SupportMapFragment?
}
}