188

ほぼフルスクリーンの DialogFragment を表示しようとしています。しかし、私はどういうわけかそうすることができません。

私がフラグメントを表示している方法は、アンドロイド開発者のドキュメントから直接です

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 Transformer
Android 3.0.1


更新: フラグメントに次のコードを使用して、全画面表示にすることができました

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_FRAME, android.R.style.Theme_Holo_Light);
}

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

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

4

31 に答える 31

74

LinearLayoutの代わりに切り替えてみてくださいRelativeLayout。テスト時に3.0HoneycombAPIをターゲットにしていました。

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

}
}

およびレイアウト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>
于 2011-08-26T17:43:39.507 に答える
18

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

    @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;
}
于 2015-07-23T20:57:29.907 に答える
13

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

それが役に立てば幸い。

于 2015-05-21T08:06:59.593 に答える
11

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);        
}
于 2012-11-19T06:38:06.950 に答える
4

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

@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));
    }
}
于 2014-10-05T21:40:35.363 に答える
2

「_Fullscreen」の追加を除いて、Chirag Nagariya は正しいです。ダイアログスタイルから派生していない基本スタイルを使用して解決できます。「android.R.style.Theme_Black_NoTitleBar」も使用できます。

于 2013-04-20T06:27:00.257 に答える
2

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

  1. テーマ エディターに移動します ([ツール] -> [Android] -> [テーマ エディター] で利用可能)
  2. すべてのテーマを表示を選択します。AppCompat.Dialogで 1 つを選択します
  3. 特定の色の背景または透明な背景にしたい場合は、オプション android window background を選択します。
  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であることを確認してください。 もう 1 つの方法は、styles.xml で新しいスタイルを作成し、上記のコードに従って変更することです。

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

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

于 2017-06-29T13:32:51.503 に答える
1

他の誰かがこれに出くわした場合に備えて、私はこれと同様の経験をしましたが、問題は、(デフォルトの super.onCreateView を返す代わりに) onCreateView から膨張したビューを返すのを忘れていたことであることが判明しました。正しい膨張したビューを返すだけで、問題は解決しました。

于 2012-03-21T18:56:32.633 に答える
1

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

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

楽しみ

于 2016-09-01T17:53:30.223 に答える
0
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);
        }
于 2019-04-16T06:53:51.190 に答える