2013-02-18 27 views
21

Próbowałem wielu poleceń, aby ustawić rozmiar mojego DialogFragment. Zawiera tylko próbnik kolorów, więc usunąłem tło i tytuł okna:Ustawianie rozmiaru modułu DialogFragment

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

Jednak również chcę, aby umieścić okno, gdzie chcę i to jest problematyczne. Używam:

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

Ale jeden (duży) przeszkodą pozostaje: chociaż moja okienko dialogowe jest niewidoczny, to wciąż ma pewną wielkość, a to ogranicza stanowiska mojego okna. LayoutParams.WRAP_CONTENT są tutaj, aby ograniczyć rozmiar tego panelu do mojego selektora kolorów, ale z jakiegoś powodu to nie działa.

Czy ktoś był w stanie zrobić coś podobnego?

+1

rozmiar i położenie okna dialogowego należy ustawić wewnątrz konstruktora Dialog. Musisz zastąpić onCreateDialog z DialogFragment i gdzie musisz utworzyć niestandardowe okno dialogowe. –

+1

+ Sudar Nimalan Dzięki, to była część rozwiązania. – Teovald

+3

Dla przyszłych czytelników, pytania pokrewne: 1) [Ustawianie rozmiaru (szerokości i wysokości) DialogFragment] (http://stackoverflow.com/questions/12478520/how-to-set-dialogfragments-width-and-height) 2) [Positioning DialogFragment] (http://stackoverflow.com/questions/9698410/position-of-dialogfragment-in-android) – Jonik

Odpowiedz

20

Po kilku próbach i błędach znalazłem rozwiązanie.

tutaj jest realizacja mojej klasie 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 odpowiada:

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

po prostu rozszerzyć domyślny styl dialogu z moich potrzeb.

Wreszcie, można powołać się ten dialog:

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

dziękuję bardzo! Chciałbym zapytać, co zrobiłeś, aby ustawić okno, w którym chcesz? Czy możesz to zrobić i jak? –

+1

W onCreateView można również uzyskać dostęp do parametrów układu za pomocą: WindowManager.LayoutParams wmlp = getDialog(). GetWindow(). GetAttributes(); . Na przykład, jeśli chcesz umieścić okno dialogowe po lewej stronie ekranu, po prostu musisz użyć wmlp.gravity = Gravity.LEFT; następnie wmlp.x = this.getResources(). getDimensionPixelOffset (R.dimen.dialog_position); – Teovald

+1

Awesome @Teovald, upto dla ciebie. Dziękuję Ci bardzo! –

41

Poznałem podobne pytanie, które jest nie można ustawić szerokość dialogFragment dodatkowych wysokość w kodzie, po kilku próbie, znalazłem rozwiązanie;

tutaj jest kilka kroków do niestandardowego DialogFragment:

1.inflate niestandardowy widok z xml na metodzie

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.Set szerokość Twojego dialogowego o wysokości w onResume(), remrember w onResume()/onStart(), wydaje się nie działać w inny sposób

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

najprostsze rozwiązanie! –

+0

To działało również dla mnie. Z jakiegoś powodu moje górne/dolne marginesy były ignorowane, ale zmieniłem je na dopełnienie i zadziałało to dla mnie. – SilithCrowe

+0

również dla mnie pracował. dzięki – Munazza

5

dla mojego przypadku użycia, chciałem DialogFragment pasujące do rozmiaru listy elementów. Widok fragmentu to widok RecyclerView w układzie o nazwie fragment_sound_picker. Dodałem wrapper RelativeLayout wokół RecyclerView.

Ustawiłem już wysokość widoku pojedynczych elementów listy na R.attr.listItemPreferredHeight w układzie o nazwie item_sound_choice.

DialogFragment uzyskuje instancję LayoutParams z zawyżonego widoku View RecyclerView, modyfikuje wysokość LayoutParams do wielokrotności długości listy i stosuje zmodyfikowane LayoutParams do nadmuchanego widoku rodzica.

Powoduje to, że DialogFragment doskonale opakowuje krótką listę wyborów. Zawiera tytuł okna i przyciski Anuluj/OK.

Oto konfiguracja w 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); 
} 

Oto 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> 
2

użyć tego kodu do zmiany rozmiaru Dialog Fragment android

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

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

Myślę, że szerokość i wysokość zależy od rozmiar ekranu, ale nie mogę naprawdę znaleźć wzór, ponieważ mam problem z ustawieniem rozmiaru na windowfragment. jeśli ustawię wysokość 150 i jeśli uzyskasz wysokość fragmentu, to daje mi ona inne odpowiedzi. pomóżcie mi w tym pytaniu https://stackoverflow.com/questions/45494644/how-to-set-height-of-the-dialog-fragment-curately-in-android –

Powiązane problemy