Как установить высоту ширины изображения на основе размера экрана в gridview

Я хочу показать 3×3 размер gridview. Я хочу установить высоту и ширину на основе размера устройства. Я ссылаюсь на эту ссылку .

Основная деятельность-

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); GridView gridview = (GridView) findViewById(R.id.gridview); gridview.setAdapter(new ImageAdapter(this)); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } } 

activity_main-

 <?xml version="1.0" encoding="utf-8"?> <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gridview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:columnWidth="90dp" android:numColumns="auto_fit" android:verticalSpacing="10dp" android:horizontalSpacing="10dp" android:stretchMode="columnWidth" android:gravity="center" /> 

Редактировать-

Как и для получения высоты и ширины экрана, каждый элемент высоты и ширины составляет 1/3 от значения высоты и ширины экрана, которые я получаю.

Solutions Collecting From Web of "Как установить высоту ширины изображения на основе размера экрана в gridview"

Не используйте размер экрана , в контексте с несколькими окнами этот метод недействителен . Если ваша сетка фиксирована размером 3 × 3, поэтому используйте настраиваемый макет ViewGroup следующим образом: (и установите содержимое элементов RelativeLayout )

 public class MainActivity extends Activity { @Override protected void onCreate(Bundle state) { setContentView(new ViewGroup(this) { private RelativeLayout[] items = new RelativeLayout[9]; private int width, height, itemWidth, itemHeight; { Random r = new Random(); for (int i = 0; i < 9; i++) { items[i] = new RelativeLayout(getContext()); float[] hsv = new float[] {360 * r.nextFloat(), .50f, .75f}; items[i].setBackgroundColor(Color.HSVToColor(hsv)); addView(items[i]); // UPDATE //////////////////////////////////// ImageView image = new ImageView(getContext()); switch (i) { case 0: // top left case 1: // top center case 2: // top right case 3: // center left case 4: // center center case 5: // center right case 6: // bottom left case 7: // bottom center case 8: // bottom right image.setImageResource(R.drawable.ic_launcher); break; } image.setScaleType(ScaleType.FIT_XY); image.setLayoutParams(new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT )); items[i].addView(image); ////////////////////////////////////////////// } } @Override protected void onMeasure(int wMS, int hMS) { width = MeasureSpec.getSize(wMS); height = MeasureSpec.getSize(hMS); itemWidth = width / 3; itemHeight = height / 3; wMS = MeasureSpec.makeMeasureSpec(itemWidth, MeasureSpec.EXACTLY); hMS = MeasureSpec.makeMeasureSpec(itemHeight, MeasureSpec.EXACTLY); measureChildren(wMS, hMS); setMeasuredDimension(width, height); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { for (int i = 0; i < 9; i++) { l = itemWidth * (i % 3); t = itemHeight * (i / 3); r = l + itemWidth; b = t + itemHeight; items[i].layout(l, t, r, b); } } }); super.onCreate(state); } } 

EDIT : см. Мое обновление в коде, вы просто должны добавить свои изображения в контейнеры элементов. С помощью этого метода XML-файл макета не требуется, поскольку вы сами управляете содержимым и сами по себе.

Результат : результат


EDIT : минималистский способ:

 public class MainActivity extends Activity { @Override protected void onCreate(Bundle state) { setContentView(new ViewGroup(this) { private static final int SIZE_X = 3; private static final int SIZE_Y = 3; private ImageView[] items = new ImageView[SIZE_X * SIZE_Y]; private int itemWidth, itemHeight; { setBackgroundColor(Color.DKGRAY); for (int i = 0; i < items.length; i++) { items[i] = new ImageView(getContext()); items[i].setScaleType(ScaleType.CENTER); items[i].setImageResource(R.drawable.ic_launcher); addView(items[i]); } } @Override protected void onMeasure(int wMS, int hMS) { int width = MeasureSpec.getSize(wMS); int height = MeasureSpec.getSize(hMS); itemWidth = width / SIZE_X; itemHeight = height / SIZE_Y; wMS = MeasureSpec.makeMeasureSpec(itemWidth, MeasureSpec.EXACTLY); hMS = MeasureSpec.makeMeasureSpec(itemHeight, MeasureSpec.EXACTLY); measureChildren(wMS, hMS); setMeasuredDimension(width, height); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { for (int i = 0; i < items.length; i++) { l = itemWidth * (i % SIZE_X); t = itemHeight * (i / SIZE_X); r = l + itemWidth; b = t + itemHeight; items[i].layout(l, t, r, b); } } }); super.onCreate(state); } } 

Результат :

Введите описание изображения здесь


@ Kanwaljit Singh:

В цикле создания элементов MainActivity:

 final int id = i; items[i].setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(getContext(), NextActivity.class).putExtra("id", id)); } }); 

В NextActivity:

 int id = getIntent().getIntExtra("id", -1); 

Размеры экрана можно получить так:

 final DisplayMetrics displayMetrics=getResources().getDisplayMetrics(); final float screenWidthInDp=displayMetrics.widthPixels; Log.WTF("ScreenWidth", "width: "+screenWidthInDp+", menuWidth: "+screenWidthInDp/3); 

И для gridview, я бы предложил вам взглянуть на эту удивительную библиотеку под названием Staggered Grid View. И их образец здесь.

Я использую следующий подход, когда мне приходится изменять размеры моей Activity , я предполагаю, что то же самое верно для вашего случая:

 // I'm storing the size of the window in the display var, so I can then play around final Display display = getWindowManager().getDefaultDisplay(); final Point size = new Point(); display.getSize(size); // In your case, you'll probably need something like this: GridView gv = (GridView) findViewById(R.id.gridview); gv.setWidth((int) size.x * 0.75); // Whis would resize the grid width to the 75% gv.setHeight((int) size.y * 0.5); // Same with the height, but to the 50%