web-dev-qa-db-ja.com

DialogFragmentのサイズを設定する

私はDialogFragmentのサイズを設定するために多くのコマンドを試してきました。カラーピッカーのみが含まれているため、ダイアログの背景とタイトルを削除しました。

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setBackgroundDrawable(
    new ColorDrawable(Android.graphics.Color.TRANSPARENT));

ただし、ダイアログを希望の場所に配置したいので、問題があります。私が使う:

WindowManager.LayoutParams params = getDialog().getWindow().getAttributes();
params.width = LayoutParams.WRAP_CONTENT;
params.height =  LayoutParams.WRAP_CONTENT;
params.gravity = Gravity.LEFT;
getDialog().getWindow().setAttributes(params);

ただし、1つの(大きな)障害が残っています。ダイアログペインが見えなくても、一定のサイズがあり、ダイアログの位置が制限されます。 LayoutParams.WRAP_CONTENTは、このペインのサイズをカラーピッカーに制限するためのものですが、何らかの理由で機能しません。

誰かが似たようなことをすることができましたか?

25
Teovald

試行錯誤の後、解決策を見つけました。

dialogFragmentクラスの実装は次のとおりです。

public class ColorDialogFragment extends SherlockDialogFragment {

    public ColorDialogFragment() {
    //You need to provide a default constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, 
                     ViewGroup container,
                     Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.dialog_color_picker, container);
    // R.layout.dialog_color_picker is the custom layout of my dialog
    WindowManager.LayoutParams wmlp = getDialog().getWindow().getAttributes();
    wmlp.gravity = Gravity.LEFT;
    return view;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(DialogFragment.STYLE_NO_FRAME, R.style.colorPickerStyle);
    // this setStyle is VERY important.
    // STYLE_NO_FRAME means that I will provide my own layout and style for the whole dialog
    // so for example the size of the default dialog will not get in my way
    // the style extends the default one. see bellow.        
    }

  }

R.style.colorPickerStyleは以下に対応します。

<style name="colorPickerStyle" parent="Theme.Sherlock.Light.Dialog">
    <item name="Android:backgroundDimEnabled">false</item>
    <item name="Android:cacheColorHint">@Android:color/transparent</item>
    <item name="Android:windowBackground">@Android:color/transparent</item>
</style>

必要に応じてデフォルトのダイアログスタイルを拡張するだけです。

最後に、このダイアログを呼び出すには:

private void showDialog() {
   ColorDialogFragment newFragment = new ColorDialogFragment();
   newFragment.show(getSupportFragmentManager(), "colorPicker");
   }   
22
Teovald

私は同じような質問に出会いました。ダイアログでdialogFragmentの幅と高さを設定することはできません、何度か試した後、私は解決策を見つけました;

カスタムDialogFragmentの手順は次のとおりです。

1.メソッドのXMLからカスタムビューを膨張させる

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState)
{

    getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    getDialog().setCanceledOnTouchOutside(true);

    View view = inflater.inflate(R.layout.XXX,
            container, false);
    //TODO:findViewById, etc
    return view;
}

2. onResume()でダイアログの幅と高さを設定し、onResume()/ onStart()でアラームを設定し、他のメソッドでは機能しなかったようです

public void onResume()
{
    super.onResume();
    Window window = getDialog().getWindow();
    window.setLayout(width, height);
    window.setGravity(Gravity.CENTER);
    //TODO:
}  
45
ruidge

私のユースケースでは、DialogFragmentがアイテムのリストのサイズに一致するようにしました。フラグメントビューは、fragment_sound_pickerというレイアウトのRecyclerViewです。 RecyclerViewの周囲にRelativeLayoutラッパーを追加しました。

R.attr.listItemPreferredHeightというレイアウトで、個々のリストアイテムビューの高さをitem_sound_choiceで既に設定していました。

DialogFragmentは、膨張したビューのRecyclerViewからLayoutParamsインスタンスを取得し、LayoutParamsの高さをリストの長さの倍数に調整し、変更されたLayoutParamsを膨張した親ビューに適用します。

その結果、DialogFragmentは選択肢の短いリストを完全にラップします。ウィンドウタイトルとキャンセル/ OKボタンが含まれています。

DialogFragmentのセットアップは次のとおりです。

// SoundPicker.Java
// extends DialogFragment
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle(getActivity().getString(R.string.txt_sound_picker_dialog_title));

    LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
    View view = layoutInflater.inflate(R.layout.fragment_sound_picker, null);
    RecyclerView rv = (RecyclerView) view.findViewById(R.id.rv_sound_list);
    rv.setLayoutManager(new LinearLayoutManager(getActivity()));

    SoundPickerAdapter soundPickerAdapter = new SoundPickerAdapter(getActivity().getApplicationContext(), this, selectedSound);
    List<SoundItem> items = getArguments().getParcelableArrayList(SOUND_ITEMS);
    soundPickerAdapter.setSoundItems(items);
    soundPickerAdapter.setRecyclerView(rv);
    rv.setAdapter(soundPickerAdapter);

    // Here's the LayoutParams setup
    ViewGroup.LayoutParams layoutParams = rv.getLayoutParams();
    layoutParams.width = RelativeLayout.LayoutParams.MATCH_PARENT;
    layoutParams.height = getListItemHeight() * (items.size() + 1);
    view.setLayoutParams(layoutParams);

    builder.setView(view);
    builder.setCancelable(true);

    builder.setNegativeButton(Android.R.string.cancel, new DialogInterface.OnClickListener() {
        // ...
    });

    builder.setPositiveButton(R.string.txt_ok, new DialogInterface.OnClickListener() {
        // ...
    });

    return builder.create();
}

@Override
public void onResume() {
    Window window = getDialog().getWindow();
    window.setLayout(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    super.onResume();
}

private int getListItemHeight() {
    TypedValue typedValue = new TypedValue();
    getActivity().getTheme().resolveAttribute(R.attr.listPreferredItemHeight, typedValue, true);
    DisplayMetrics metrics = new Android.util.DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
    return (int) typedValue.getDimension(metrics);
}

fragment_sound_pickerは次のとおりです。

<?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="wrap_content">

    <Android.support.v7.widget.RecyclerView
        Android:id="@+id/rv_sound_list"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content" />
</RelativeLayout>
5
Ari Lacenski

dialog Fragment Androidのサイズ変更にこのコードを使用します

public void onResume() {
        super.onResume();

        super.onResume();
        Window window = getDialog().getWindow();
        window.setLayout(250, 100);
        window.setGravity(Gravity.RIGHT);
    }
2
Mahi Saini