2016-09-12 4 views
1

Я хочу создать простой диалог, который имеет сетку в середине и позволяет пользователю выбрать букву.Заглавие на DialogFragment

Вот XML я начал следующим образом: https://developer.android.com/guide/topics/ui/layout/gridview.html и некоторые другие:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content"> 
    <GridView xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/gridview" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:columnWidth="90dp" 
       android:numColumns="auto_fit" 
       android:verticalSpacing="10dp" 
       android:horizontalSpacing="10dp" 
       android:stretchMode="columnWidth" 
       android:gravity="center" 
     /> 
</LinearLayout> 

И тогда у меня есть этот код, чтобы использовать его:

package com.example.activity; 

import android.app.Dialog; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.DialogFragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.*; 

/** 
* Select a letter from the dialog 
*/ 
public class SelectLetterDialogFragment extends DialogFragment { 
    GridView gridView; 

    static final String[] numbers = new String[] { 
      "A", "B", "C", "D", "E", 
      "F", "G", "H", "I", "J", 
      "K", "L", "M", "N", "O", 
      "P", "Q", "R", "S", "T", 
      "U", "V", "W", "X", "Y", "Z"}; 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     Dialog dialog = super.onCreateDialog(savedInstanceState); 
     dialog.setTitle("Select a letter"); 

     return dialog; 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { 
     final View view = inflater.inflate(R.layout.select_letter_dialog, container); 

     gridView = (GridView) view.findViewById(R.id.gridview); 

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(view.getContext(), android.R.layout.simple_list_item_1, numbers); 

     gridView.setAdapter(adapter); 
     gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View v, 
            int position, long id) { 
       String letter = ((TextView) v).getText().toString(); 
       Log.e("Blah", letter); 
       dismiss(); 
      } 
     }); 

     setStyle(STYLE_NORMAL, android.R.style.Theme_Holo_Dialog); 

     return view; 
    } 
} 

Таким образом, это создает диалоговое окно с только сетка с буквами на ней. Это меня смущает. Итак, первый вопрос: что делает dialog.setTitle("Select a letter"), так как он не влияет на это?

Затем я изменил файл XML, чтобы добавить TextView поставить титул в так:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content"> 
    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Select a Letter" 
     /> 
    <GridView xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/gridview" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:columnWidth="90dp" 
       android:numColumns="auto_fit" 
       android:verticalSpacing="10dp" 
       android:horizontalSpacing="10dp" 
       android:stretchMode="columnWidth" 
       android:gravity="center" 
     /> 
</LinearLayout> 

А теперь буквы в одном столбце. Итак, мой второй вопрос: WTF? Почему это так ведет себя?

Мой третий и реальный вопрос: как получить заголовок в моем диалоговом окне с буквами четыре в сетке, как в первом примере?

ответ

0

Я никогда не получить GridLayout или GridView, чтобы работать должным образом. Я закончил тем, что просто добавил LinearLayouts и установил ширину на них, чтобы они работали в сетке. Использование стилей делало это лучше.

0

Использование некоторых из фрагмента:

public void customDialog(){ 
    Dialog dialog=new Dialog(this); 
    dialog.requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 
    dialog.setContentView(R.layout.select_letter_dialog); 
    dialog.getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.custom_title); 
    dialog.show(); 
} 

Реза/макет/custom_title.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="This is a custom title"/> 
+0

Это больше не рекомендуется. – Thom

0

Как комментарий onCreateDialog: enter image description here Я думаю, вы можете попробовать, чтобы переместить код onCreateView в onCreateDialog, а затем удалить onCreateView. как это:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    Dialog dialog = super.onCreateDialog(savedInstanceState); 
    dialog.setContentView(R.layout.select_letter_dialog); 
    dialog.setTitle("Select a letter"); 
    gridView = (GridView) dialog .findViewById(R.id.gridview); 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(view.getContext(), android.R.layout.simple_list_item_1, numbers); 

    gridView.setAdapter(adapter); 
    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, 
           int position, long id) { 
      String letter = ((TextView) v).getText().toString(); 
      Log.e("Blah", letter); 
      dismiss(); 
     } 
    }); 

    setStyle(STYLE_NORMAL, android.R.style.Theme_Holo_Dialog); 

    return dialog; 
} 
+0

Я не использую AlertDialog – Thom

0

В вашем предыдущем коде (причина 2 вопроса)

андроид: numColumns = "auto_fit (в сетке)
андроида: layout_width =" wrap_content»(в родительской раскладке)

поэтому его показывая буквы в одной строке (с места, как большая часть заголовка)

И его решение установить

андроид: numColumns = 4 (в сетке)
андроид: layout_width = "match_parent" (в родительском макете)

+0

Это не исправить мою проблему. – Thom

Смежные вопросы