2016-03-23 6 views
1

2つのEditTextフィールドのダイアログを実装しています。マテリアルデザイン仕様によれば、この種のダイアログは小さなデバイスではフルスクリーンで表示する必要がありますが、大きなスクリーンではダイアログウィンドウで表示する必要があります。DialogFragmentがDialogとして表示され、方向変更時にフルスクリーンにサイズ変更されます

これを実現するには、developer.android.com guide on Dialogsの実装に従いました。

小さな画面では問題ありませんが、大きな画面では方向変更後にダイアログウィンドウが全画面表示されます。その後、

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) 
{ 
    setStyle(DialogFragment.STYLE_NORMAL, R.style.AppTheme); 

    View v = inflater.inflate(R.layout.dialog_filter_audio_files, 
           container, false); 

    // code for Buttons and EditTexts here: 
    // set listeners etc. 

    return v; 
} 

...と:

コードDialogFragment(私のAppCompatActivityonOptionsItemSelected()の一部)DialogFragmentについては

mIsLargeLayout = getResources().getBoolean(R.bool.large_layout); 

FragmentManager fragmentManager = getSupportFragmentManager(); 
mDialog = MyDialogFragment.newInstance(mIsLargeLayout); 

if (mIsLargeLayout) 
{ 
    // The device is using a large layout, so show the fragment as a dialog 
    mDialog.show(fragmentManager, "dialog"); 
} 
else 
{ 
    // The device is smaller, so show the fragment fullscreen 
    FragmentTransaction transaction = fragmentManager.beginTransaction(); 
    // 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, mDialog, "dialog") 
        .addToBackStack(null) 
        .commit(); 
} 

を示すために、私は私のカスタムレイアウトを膨らませるために最初onCreateView()を上書きonCreateDialog()には、次の文が含まれます。

Dialog dialog = super.onCreateDialog(savedInstanceState); 
dialog.setCancelable(true); 
dialog.getWindow().setBackgroundDrawableResource(R.color.c_background_dark); 
return dialog; 

私は姿勢の変化にDialogFragmentを却下しませんが、onRestoreInstanceState()に私はこのようなDialogFragmentに再接続:

mDialog = (DialogFilterAudiofiles) getSupportFragmentManager().findFragmentByTag("dialog"); 

ユーザーは関係なく、それは、私がしたいように見えるかのダイアログを完了しないことが可能ですがオリエンテーションが変更される前と同じように、ダイアログを小さくするのが好きです。

これまで入力を保存してからonRestoreInstanceState()に新しいダイアログを表示した後で、ダイアログを閉じることができました(onSaveInstanceState())。 または、画面サイズが大きい場合は、AlertDialogおよびsetContentView()に基づいてDialogFragmentを使用して作業することができます。

サンプルコードをガイドから修正する別の方法はありますか?

EDIT 私は「one layout fits all sizes」アプローチに可能な限り近づきたいと思います。

"onCreateView()"の実装は、 サンプルコードのインスピレーションを受けているため、上記のテキストに関連する部分を追加しました。

答えて

3

を見ます小さなウィンドウでは、mIsLargeLayoutの値に応じて異なります。

ただし、設定変更後に再作成する必要がある場合は、この行によってフルスクリーン表示されます。

私の期待は値R.style.AppThemeがランタイムアプリのテーマの一部であったカスタムダイアログのスタイルを検索するだろうということだったが、設定後に再作成するときに、実際にそれだけでActivityの一種としてDialogFragmentを扱います変化する。

オプションのカスタムテーマを:文全体を落とす私の場合は

は、二番目のパラメータのために documentationから

setStyle(DialogFragment.STYLE_NORMAL, 0); 

を使用してだけでなく、働いていました。 0の場合は、適切なテーマ(スタイルに基づく)が選択されます。

0

レイアウトのルート要素で、より大きなデバイス用のダイアログレイアウトで画面に表示されないサイズを定義します。

setStyle(DialogFragment.STYLE_NORMAL, R.style.AppTheme);

最初で正常に動作します::DialogFragmentは、全画面のダイアログとして作成されたか、問題が解決しない場合、私は最終的に問題の原因が見つからhow-to-set-a-maximum-height-with-wrap-content-in-android

+0

この方法では、小さなデバイス用のフルスクリーンダイアログが表示されますか?ガイドのサンプルは、両方のオプションで同じレイアウトを使用することが可能であることを示唆しています。 - OK - ここに隠れるボタンと、そこで膨らませるメニュー。フラグメントは "mIsLargeLayout"値を取得し、状況に適応します – 0X0nosugar

関連する問題