2013-02-18 6 views
21

Ho provato molti comandi per impostare la dimensione del mio DialogFragment. Esso contiene solo un colore-picker, così ho tolto lo sfondo e il titolo della finestra di dialogo:Impostazione della dimensione di un DialogFragment

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

Tuttavia voglio anche posizionare la finestra di dialogo dove voglio ed è problematico. Io uso:

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

Ma una (grande) ostacolo rimane: anche se il mio riquadro di dialogo è invisibile, ha ancora una certa dimensione, e limita le posizioni della mia finestra. Gli LayoutParams.WRAP_CONTENT sono qui per limitare le dimensioni di questo riquadro al mio selettore di colori, ma per qualche motivo non funziona.

Qualcuno è stato in grado di fare qualcosa di simile?

+1

Dimensioni e posizione della finestra di dialogo deve essere impostato all'interno del costruttore Dialog. Devi scavalcare onCreateDialog di DialogFragment e dove devi creare una finestra di dialogo personalizzata. –

+1

+ Sudar Nimalan Grazie, quella era una parte della soluzione. – Teovald

+3

Per i futuri lettori, domande correlate: 1) [Impostazione della dimensione (larghezza e altezza) di 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

risposta

20

Dopo alcune prove ed errori, ho trovato la soluzione.

qui è l'implementazione della mia classe 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 corrisponde a:

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

ho semplicemente estendo uno stile di dialogo default con le mie esigenze.

Infine, è possibile richiamare questa finestra di dialogo con:

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

grazie mille! Vorrei chiederti cosa hai fatto per posizionare la finestra di dialogo dove vuoi? Potresti farlo e come? –

+1

In onCreateView, è anche possibile accedere ai parametri del layout con: WindowManager.LayoutParams wmlp = getDialog(). GetWindow(). GetAttributes(); . Quindi, ad esempio, se vuoi mettere la finestra di dialogo sul lato sinistro dello schermo, devi solo usare wmlp.gravity = Gravity.LEFT; then wmlp.x = this.getResources(). getDimensionPixelOffset (R.dimen.dialog_position); – Teovald

+1

Awesome @Teovald, un upvote per te. Grazie mille! –

41

ho incontrato una domanda simile che è non è possibile impostare la larghezza del dialogFragment un'altezza nel codice, dopo diversi try, ho trovato una soluzione;

ecco passi per DialogFragment personalizzato:

1.inflate visualizzazione personalizzata da XML sul metodo

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 larghezza della finestra di altezza in onResume(), remrember in onResume()/onStart(), sembra non ha funzionato nella altro metodo

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

soluzione più semplice! –

+0

Questo ha funzionato anche per me. Per qualche motivo i miei margini superiori/inferiori venivano ignorati, ma l'ho cambiato in padding e ha funzionato per me. – SilithCrowe

+0

ha funzionato anche per me. grazie – Munazza

5

per il mio caso d'uso, ho voluto il DialogFragment in base alle dimensioni di un elenco di elementi. La vista frammento è una vista Recycler in un layout chiamato fragment_sound_picker. Ho aggiunto un wrapper RelativeLayout a RecyclerView.

Avevo già impostato l'altezza della vista della singola voce di elenco con R.attr.listItemPreferredHeight, in un layout denominato item_sound_choice.

L'oggetto DialogFragment ottiene un'istanza di LayoutParams dal View di visualizzazione di visualizzazione gonfiato, modifica l'altezza di LayoutParams su un multiplo della lunghezza dell'elenco e applica i LayoutParam modificati alla Vista padre gonfiata.

Il risultato è che DialogFragment racchiude perfettamente la breve lista di scelte. Include il titolo della finestra e i pulsanti Annulla/OK.

Ecco il setup nella 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); 
} 

Ecco 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

utilizzare questo codice per ridimensionamento della finestra di dialogo Frammento Android

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

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

penso che la larghezza e l'altezza dipenda da dimensione dello schermo, ma non riesco a trovare il modello perché sto affrontando problemi quando si imposta la dimensione di dialogfragment. se imposto l'altezza 150 e se ottieni l'altezza del frammento mi sta dando altre risposte. per favore aiutami in questa domanda https://stackoverflow.com/questions/45494644/how-to-set-the-height-of-the-dialog-fragment-accurately-in-android –