ほぼ全画面のDialogFragmentを表示しようとしています。しかし、私は何とかそうすることができません。
フラグメントの表示方法は、Android開発者ドキュメントから直接です。
FragmentManager f = ((Activity)getContext()).getFragmentManager();
FragmentTransaction ft = f.beginTransaction();
Fragment prev = f.findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
// Create and show the dialog.
DialogFragment newFragment = new DetailsDialogFragment();
newFragment.show(ft, "dialog");
私は素朴にフラグメントのRelativeLayoutをfill_parentとminWidthとminHeightに設定しようとしたことを知っています。
<RelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:minWidth="1000px"
Android:minHeight="600px"
Android:background="#ff0000">
DialogFragmentが画面の大部分を占めることを期待しています。しかし、私は垂直方向にだけサイズを変更するように見えますが、水平方向に一定の幅になるまでです。
ここで提案されているように、コードでウィンドウ属性を設定しようとしました: http://groups.google.com/group/Android-developers/browse_thread/thread/f0bb813f643604ec 。しかし、これも助けにはなりませんでした。
私はおそらくAndroidがダイアログをどのように処理するかについて誤解しているでしょう。どうすればこのようなことができますか?私の目標を達成する別の方法はありますか?
Androidデバイス:
Asus EeePadトランスフォーマー
Android 3.0.1
更新:フラグメント内の次のコードを使用して、全画面表示することができました
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(STYLE_NO_FRAME, Android.R.style.Theme_Holo_Light);
}
残念ながら、これは私が望んでいることではない背景を表示するには、ダイアログの周りに小さな「パディング」が必要です。
それを達成する方法はありますか?
LinearLayout
ではなくRelativeLayout
に切り替えてみてください。テスト時に3.0 Honeycomb APIをターゲットにしていました。
public class FragmentDialog extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.show);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
showDialog();
}
});
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
void showDialog() {
FragmentTransaction ft = getFragmentManager().beginTransaction();
DialogFragment newFragment = MyDialogFragment.newInstance();
newFragment.show(ft, "dialog");
}
public static class MyDialogFragment extends DialogFragment {
static MyDialogFragment newInstance() {
MyDialogFragment f = new MyDialogFragment();
return f;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_dialog, container, false);
return v;
}
}
}
およびlayouts:fragment_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:minWidth="1000dp"
Android:minHeight="1000dp">
</LinearLayout>
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="#ffffff">
<Button Android:id="@+id/show"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_weight="0"
Android:text="show">
</Button>
</LinearLayout>
全画面でDialogFragmentを取得するには
次のように、DialogFragmentのonStart
をオーバーライドします。
@Override
public void onStart()
{
super.onStart();
Dialog dialog = getDialog();
if (dialog != null)
{
int width = ViewGroup.LayoutParams.MATCH_PARENT;
int height = ViewGroup.LayoutParams.MATCH_PARENT;
dialog.getWindow().setLayout(width, height);
}
}
そして、この投稿に非常に感謝します: The-mystery-of-androids-full-screen-dialog-fragments
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL,
Android.R.style.Theme_Black_NoTitleBar_Fullscreen);
}
このリンクによると DialogFragment fullscreenは両側にパディングを表示します これは魅力のように機能します。
@Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
// the content
final RelativeLayout root = new RelativeLayout(getActivity());
root.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
// creating the fullscreen dialog
final Dialog dialog = new Dialog(getActivity());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(root);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
return dialog;
}
私の場合、次のアプローチを使用しました。
@Override
public void onStart() {
super.onStart();
getDialog().getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
}
}
さらに、すべてのスペースをコンテンツで埋めるためのLinearLayout。
ただし、ダイアログの左端と右端と一部のLollipop +デバイス(Nexus 9など)の画面の端との間にまだ小さなギャップがありました。
明らかではありませんでしたが、最終的にはすべてのデバイスとプラットフォームで全幅にすることがわかりましたウィンドウの背景は内部で指定する必要があります以下のようなstyles.xml:
<style name="Dialog.NoTitle" parent="Theme.AppCompat.Dialog">
<item name="Android:windowNoTitle">true</item>
<item name="Android:padding">0dp</item>
<item name="Android:windowBackground">@color/window_bg</item>
</style>
そしてもちろん、このスタイルは、次のようなダイアログを作成するときに使用する必要があります。
public static DialogFragment createNoTitleDlg() {
DialogFragment frag = new Some_Dialog_Frag();
frag.setStyle(DialogFragment.STYLE_NO_TITLE, R.style.Dialog_NoTitle);
return frag;
}
フルスクリーンdialogFragmentを使用するとき、私は前に問題に出会いました:フルスクリーンを設定している間、常にパディングがあります。 dialogFragmentのonActivityCreated()メソッドで次のコードを試してください。
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
Window window = getDialog().getWindow();
LayoutParams attributes = window.getAttributes();
//must setBackgroundDrawable(TRANSPARENT) in onActivityCreated()
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
if (needFullScreen)
{
window.setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
}
}
1。style.xml
に追加:
<style name="FullScreenDialog" parent="Theme.AppCompat.Light.Dialog">
<item name="Android:backgroundDimEnabled">false</item>
<item name="Android:windowNoTitle">true</item>
<item name="Android:padding">0dp</item>
<item name="Android:windowIsFloating">false</item>
<item name="Android:windowBackground">@Android:color/transparent</item>
</style>
2。DialogFragmentに追加:
@Override
public int getTheme() {
return R.style.FullScreenDialog;
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(DialogFragment.STYLE_NO_FRAME, R.style.AppTheme)
}
ここで、AppTheme
は、スタイルで定義したテーマです。
Android APIが更新された限り、フルスクリーンダイアログを表示するための推奨される方法は次のとおりです。
FragmentTransaction transaction = this.mFragmentManager.beginTransaction();
// For a little polish, specify a transition animation
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
// To make it fullscreen, use the 'content' root view as the container
// for the fragment, which is always the root view for the activity
transaction.add(Android.R.id.content, this.mFragmentToShow).commit();
それ以外の場合、フルスクリーンで表示したくない場合は、次の方法で実行できます。
this.mFragmentToShow.show(this.mFragmentManager, LOGTAG);
それが役に立てば幸い。
編集
私が与えた解決策は機能しますが、時には面倒になる可能性のある弱点があることに注意してください。 DialogFragmentをAndroid.R.id.content
コンテナーに追加すると、DialogFragment#setCancelable()
機能を正しく処理できず、DialogFragment自体をバックスタックに追加するときに予期しない動作が発生する可能性があります。
したがって、onCreateメソッドでDialogFragmentのスタイルを次のように簡単に変更することをお勧めします。
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL, Android.R.style.Theme_Translucent_NoTitleBar);
}
それが役に立てば幸い。
OnCreateでsetStyle()を使用し、タイトルのないonCreateDialog作成ダイアログをオーバーライドしてください。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL, Android.R.style.Theme);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
return dialog;
}
または、onCreate()とsetStyleをオーバーライドするだけです。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NO_TITLE, Android.R.style.Theme);
}
実際、レイアウトの定義方法によって異なります。しかし、ダイアログが必要なサイズになるようにするには、ダイアログが表示されたら(作成時ではなく)LayoutParamsを提供するのが最善の解決策です。 DialogFragmentでは、ダイアログはonStartメソッドで表示されるため、全幅を取得する有効なメソッドは次のとおりです。
@Override public void onStart() {
super.onStart();
Dialog d = getDialog();
if (d!=null){
d.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}
}
NO_TITLEスタイルなどのテーマまたはスタイルも提供するには、最適な場所はonCreateメソッドです。
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(STYLE_NO_TITLE, Android.R.style.Theme_Holo_Light_Dialog);
}
これは私がこの問題をどのように理解したかの解決策です:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
return dialog;
}
@Override
public void onStart() {
super.onStart();
Dialog dialog = getDialog();
if (dialog != null) {
dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
}
Chirag Nagariyaは、「_ Fullscreen」オプションを除いて正しいです。 Dialogスタイルから派生していないベーススタイルを使用して解決できます。 「Android.R.style.Theme_Black_NoTitleBar」も使用できます。
Style.xmlで以下のテーマを作成します。
<style name="DialogTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="Android:paddingRight">0dp</item>
<item name="Android:paddingLeft">0dp</item>
<item name="Android:layout_width">match_parent</item>
<item name="Android:windowNoTitle">true</item>
</style>
次に、DialogFragmentでスタイルを設定します
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogTheme);
}
そして、kotlinバージョン!
override fun onStart() {
super.onStart()
dialog?.let {
val width = ViewGroup.LayoutParams.MATCH_PARENT
val height = ViewGroup.LayoutParams.MATCH_PARENT
it.window?.setLayout(width, height)
}
}
注:ここでも正しい答えを見つけることができます。しかし、混乱を明確にする必要があります。
Android.app.DialogFragment
には以下のコードを使用します@Override
public void onStart()
{
super.onStart();
Dialog dialog = getDialog();
if (dialog != null)
{
int width = ViewGroup.LayoutParams.MATCH_PARENT;
int height = ViewGroup.LayoutParams.MATCH_PARENT;
dialog.getWindow().setLayout(width, height);
}
}
Android.support.v4.app.DialogFragment
には以下のコードを使用します@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL, Android.R.style.Theme_Black_NoTitleBar_Fullscreen);
}
複数の用途の共通フラグメントダイアログでこれを試してください。これが賭けに役立つことを願っています
public class DialogFragment extends DialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_visit_history_main, container, false);
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
initializeUI(rootView);
return rootView;
}
@Override
public void onStart() {
super.onStart();
Dialog dialog = getDialog();
if (dialog != null) {
int width = ViewGroup.LayoutParams.MATCH_PARENT;
int height = ViewGroup.LayoutParams.MATCH_PARENT;
dialog.getWindow().setLayout(width, height);
}
}
private void initializeUI(View rootView) {
//getChildFragmentManager().beginTransaction().replace(R.id.fv_container,FragmentVisitHistory.getInstance(), AppConstant.FRAGMENT_VISIT_HISTORY).commit();
}
}
私はこの質問に答えるのに非常に遅れていますが、将来は誰でもこれを使用できるように、この答えを共有したいと思います。
プロジェクトでこのコードを使用しましたが、それは下位バージョンでも上位バージョンでも動作します。
次のようにonCreateDialog()内でこのテーマを使用します。
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_pump_details, null);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), Android.R.style.Theme_Black_NoTitleBar_Fullscreen);
return builder.create();
}
Android.R.style.Theme_Black_NoTitleBar_Fullscreen-このテーマのソースコードを次に示します。このテーマのみで、DialogFragmentをフルスクリーンで表示できます。
<!-- Variant of {@link #Theme_Black} that has no title bar and
no status bar. This theme
sets {@link Android.R.attr#windowFullscreen} to true. -->
<style name="Theme.Black.NoTitleBar.Fullscreen">
<item name="windowFullscreen">true</item>
<item name="windowContentOverlay">@null</item>
</style>
誰かが問題に直面した場合、私に知らせてください。これが役に立てば幸いです。ありがとう:)
他の誰かがこれに遭遇した場合、私はこれと同様の経験をしましたが、問題はonCreateViewから膨張したビューを返すのを忘れていたということです(代わりにデフォルトのsuper.onCreateViewを返す)。単に適切な拡大図を返しただけで、問題は解決しました。
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = new Dialog(getActivity(), Android.R.style.Theme_Holo_Light);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
return dialog;
}
このソリューションは、ダイアログに全画面テーマを適用します。これは、onCreateのChiragのsetStyleに似ています。欠点は、savedInstanceStateが使用されないことです。
これは、フラグメントに設定する必要があるものです。
/* theme is optional, I am using leanback... */
setStyle(STYLE_NORMAL, R.style.AppTheme_Leanback);
あなたの場合:
DialogFragment newFragment = new DetailsDialogFragment();
newFragment.setStyle(STYLE_NORMAL, R.style.AppTheme_Leanback);
newFragment.show(ft, "dialog");
なぜ? DialogFragment(明示的に指定されていない場合)では、カスタムレイアウトをラップする内部スタイルを使用します(フルスクリーンなしなど)。
そしてレイアウト?ハックな方法は必要ありません、これはうまく機能しています:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
...
</RelativeLayout>
楽しい
次の方法は、相対レイアウトで作業している場合でも機能します。次の手順に従ってください:
styles.xmlに移動し、追加したテーマの下に、次の2つの属性を追加します。
<item name="Android:windowNoTitle">true</item>
<item name="Android:windowIsFloating">false</item>
ダイアログのテーマ設定は次のとおりです。
<style name="DialogTheme" parent="Theme.AppCompat.Dialog" >
<item name="Android:layout_width">match_parent</item>
<item name="Android:layout_height">match_parent</item>
<item name="Android:windowBackground">@Android:color/transparent</item>
<item name="Android:windowNoTitle">true</item>
<item name="Android:windowIsFloating">false</item>
テーマの親がTheme.AppCompat.Dialogであることを確認してください。別の方法は、styles.xmlで新しいスタイルを作成し、上記のコードに従って変更することです。
Dialog Fragmentクラスに移動し、onCreate()メソッドで、Dialogのスタイルを次のように設定します。
@Override public void onCreate(@Nullable Bundle savedInstanceState){super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NORMAL、R.style.DialogTheme); }
全画面ダイアログのスタイルで以下の行を追加します。
<item name="Android:windowNoTitle">true</item>
<item name="Android:windowFullscreen">true</item>
<item name="Android:windowIsFloating">false</item>
新しいConstraintLayout
を使用した解決策は、ConstraintLayout
をminHeightとminWidthを固定してLinearLayout
にラップすることです。ラッピングがなければ、ConstraintLayoutはダイアログに適切なサイズを取得しません。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:minWidth="1000dp"
Android:minHeight="1000dp"
Android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@color/background_color"
Android:orientation="vertical">
<!-- some constrained views -->
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
This below answer works for me in fragment dialog.
Dialog dialog = getDialog();
if (dialog != null)
{
int width = ViewGroup.LayoutParams.MATCH_PARENT;
int height = ViewGroup.LayoutParams.MATCH_PARENT;
dialog.getWindow().setLayout(width, height);
}
window.setLayout
は、古いデバイスには十分ではありません。
ここに私がやることがあります:
try {
ViewGroup parent = (ViewGroup) view;
do {
parent = (ViewGroup) parent.getParent();
if (parent == null)
break;
parent.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
parent.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
parent.requestLayout();
} while (true);
} catch (Exception e){}