web-dev-qa-db-ja.com

Androidの全画面DialogFragment

ほぼ全画面の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);
}

残念ながら、これは私が望んでいることではない背景を表示するには、ダイアログの周りに小さな「パディング」が必要です。

それを達成する方法はありますか?

134
Eric

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;
    }

}
}

およびlayoutsfragment_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>
74
bradley4

全画面で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

143
David
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setStyle(DialogFragment.STYLE_NORMAL,
             Android.R.style.Theme_Black_NoTitleBar_Fullscreen);
}
122
Chirag Nagariya

このリンクによると 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;
}
38
Ayman Mahgoub

私の場合、次のアプローチを使用しました。

    @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;
}
17
goRGon

フルスクリーン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);
    }
}
15
ruidge

スタイルのみを使用してフルスクリーンDialogFragmentを作成する

最初の解決策

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は、スタイルで定義したテーマです。

15
vovahost

Android AP​​Iが更新された限り、フルスクリーンダイアログを表示するための推奨される方法は次のとおりです。

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);
}

それが役に立てば幸い。

10
andrea.rinaldi

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);        
}
9
Jay Parker

実際、レイアウトの定義方法によって異なります。しかし、ダイアログが必要なサイズになるようにするには、ダイアログが表示されたら(作成時ではなく)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);
}
8
coderazzi

これは私がこの問題をどのように理解したかの解決策です:

@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));
    }
}
4
savepopulation

Chirag Nagariyaは、「_ Fullscreen」オプションを除いて正しいです。 Dialogスタイルから派生していないベーススタイルを使用して解決できます。 「Android.R.style.Theme_Black_NoTitleBar」も使用できます。

2
Shoham Ben-Har

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);
}
2
Zahra.HY

そして、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)
    }
}
1
Boldijar Paul

注:ここでも正しい答えを見つけることができます。しかし、混乱を明確にする必要があります。

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);
}
1
Khemraj

複数の用途の共通フラグメントダイアログでこれを試してください。これが賭けに役立つことを願っています

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();
    }
}
1
Dashrath Rathod

私はこの質問に答えるのに非常に遅れていますが、将来は誰でもこれを使用できるように、この答えを共有したいと思います。

プロジェクトでこのコードを使用しましたが、それは下位バージョンでも上位バージョンでも動作します。

次のように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>

誰かが問題に直面した場合、私に知らせてください。これが役に立てば幸いです。ありがとう:)

1
Biswajit

他の誰かがこれに遭遇した場合、私はこれと同様の経験をしましたが、問題はonCreateViewから膨張したビューを返すのを忘れていたということです(代わりにデフォルトのsuper.onCreateViewを返す)。単に適切な拡大図を返しただけで、問題は解決しました。

1
user1205577
@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が使用されないことです。

1
Xingang Huang

これは、フラグメントに設定する必要があるものです。

/* 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>

楽しい

1
arenaq

次の方法は、相対レイアウトで作業している場合でも機能します。次の手順に従ってください:

  1. テーマエディターに移動します([ツール]-> Android->テーマエディターで利用可能)
  2. [すべてのテーマを表示]を選択します。 AppCompat.Dialogで選択します
  3. 特定の色の背景または透明な背景にする場合は、オプションAndroidウィンドウの背景を選択します。
  4. 色を選択して[OK]をクリックします。新しいテーマの名前を選択します。
  5. 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で新しいスタイルを作成し、上記のコードに従って変更することです。

  1. Dialog Fragmentクラスに移動し、onCreate()メソッドで、Dialogのスタイルを次のように設定します。

    @Override public void onCreate(@Nullable Bundle savedInstanceState){super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NORMAL、R.style.DialogTheme); }

1
Saumya Mehta

全画面ダイアログのスタイルで以下の行を追加します。

<item name="Android:windowNoTitle">true</item>
    <item name="Android:windowFullscreen">true</item>
    <item name="Android:windowIsFloating">false</item>
0
MEGHA DOBARIYA

新しい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>
0
Nicola Gallazzi
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);
        }
0
MEGHA DOBARIYA

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){}
0
palindrom