Подтвердить что ты не робот

Установка размера диалогового окна

Я пытался много команд настроить размер моего 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);

Но одно (большое) препятствие остается: хотя мое диалоговое окно невидимо, оно все еще имеет определенный размер и ограничивает позиции моего диалога. LayoutParams.WRAP_CONTENT здесь, чтобы ограничить размер этой панели моим цветовым подборщиком, но по какой-то причине он не работает.

Кто-нибудь мог сделать что-то подобное?

4b9b3361

Ответ 1

После некоторых проб и ошибок я нашел решение.

вот реализация моего класса 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");
   }   

Ответ 2

Я встретил аналогичный вопрос: вы не можете установить ширину 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(), remrember в onResume()/onStart(), похоже, не работает в другом методе

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

Ответ 3

В моем случае использования я хотел, чтобы DialogFragment соответствовал размеру списка элементов. Представление фрагмента представляет собой RecyclerView в макете под названием fragment_sound_picker. Я добавил оболочку RelativeLayout вокруг RecyclerView.

Я уже установил высоту представления списка отдельных элементов с помощью R.attr.listItemPreferredHeight в макете item_sound_choice.

DialogFragment получает экземпляр LayoutParams из раздутого View RecyclerView, улучшает высоту LayoutParams до кратного длины списка и применяет модифицированные LayoutParams к раздутому родительскому представлению.

В результате 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 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>

Ответ 4

используйте этот код для изменения размера андроида диалогового окна

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

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