Android: обернуть GridView в диалог - PullRequest
1 голос
/ 24 июня 2011

Кто-нибудь знает, как обернуть GridView?

Несмотря на то, что для layout_width установлено значение wrap_content как в GridView, так и в родительском LinearLayout, GridView по-прежнему больше, чем его содержимое в 3 столбца (примерно вдвое больше ширины содержимого). Пытался также применить исправленный layout_width = ... dp. Это тоже не сработало.

Есть идеи, как обернуть GridView? Смотри ниже.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   
          android:id="@+id/layout_root"   
          android:orientation="vertical"   
          android:layout_width="wrap_content"   
          android:layout_height="wrap_content"   
          android:padding="10dp" >

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

</LinearLayout>   

Ответы [ 3 ]

2 голосов
/ 25 июня 2011

Установка LinearLayout и GridView на «wrap_contents» не будет работать, так как GridView по умолчанию имеет значение «fill_parent», если вы не укажете ему определенный размер.Я провел некоторое тестирование, и у вас есть несколько решений в зависимости от того, как вы создаете свое представление:

Установка LinearLayout для Android: layout_width = "100dip"

View view = getLayoutInflater().inflate(R.layout.grid_dialog, null);
dialog.setContentView(view);

=> не работает как ожидалось: инфлятор не имеет родительского представления при накачивании, поэтому он просто не учитывает все атрибуты android: layout_XXX.

    dialog.setContentView(R.layout.grid_dialog);

=> работает как и ожидалось, потому что на этот раз диалоговое окно выполнит раздувание и узнает родительское представление.Вы можете использовать dialog.findViewById для получения вида сетки при необходимости ....

Установка GridView на android: layout_width = "100dip"

Видимо работает все время , поскольку у него есть родительский элемент, когда он раздувается, атрибуты layout_XXX на самом деле работают.

Все это не идеально, поскольку оно не выполняет реальное wrap_content в GridView, и вам необходимо вручную установить layout_width,но это должно работать.

0 голосов
/ 25 октября 2013

Вы можете попробовать установить ширину во время выполнения, например:

dialog.show();
LayoutParams params = dialog.getWindow().getAttributes();
params.width = 100;
dialog.getWindow().setAttributes(params);

Ссылка: Как настроить ширину AlertDialog и т. Д.

0 голосов
/ 28 июня 2011

Спасибо, Грегори.Я не уверен, как сделать dialog.setContentView (R.layout.grid_dialog) в конструкторе AlertDialog.Диалоговое окно AlertView имеет только SetView, но не setContentView доступно.Любые советы о том, как надуть AlertDialog, чтобы он знал его родительское представление?Посмотрите код AlertDialog, который я использую ниже, который не охватывает GridView:

protected Dialog onCreateDialog(int id) {   
    switch(id) {   
    case CATEGORY_ID:   
            AlertDialog.Builder builder;   
            Context mContext = this;   
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);   
            View layout = inflater.inflate(R.layout.categorydialog_3_cols, (ViewGroup) findViewById(R.id.layout_root));   
            GridView gridview = (GridView) layout.findViewById(R.id.gridview);   
            gridview.setAdapter(new ImageAdapter(this));   
            gridview.setOnItemClickListener(new OnItemClickListener() {   
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {   
                Toast.makeText(FS_90x90.this, "" + position, Toast.LENGTH_SHORT).show();   
            }   
        });   
            builder = new AlertDialog.Builder(mContext);   
            builder.setView(layout);   
            dialog = builder.create();   
        break;   
    default:   
        dialog = null;   
    }   
    return dialog;   
}   

Кроме того,

View layout = inflater.inflate (R.layout.categorydialog_3_cols, (ViewGroup) findViewById (R.id.layout_root));

имеет родительское представление (для представления Grid), определенное как

(ViewGroup) findViewById (R.id.layout_root)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...