Android mengatur tinggi dan lebar tampilan Kustom secara terprogram

128

Saya telah membuat tampilan khusus bernama Graphview. Berikut adalah struktur untuk kelas GraphView.

public class GraphView extends View {

    public GraphView(Context context, float[] values, String title, String[] horlabels, String[] verlabels, boolean type) {
        super(context);
                ........
   }

   ..................
   .................
}

Saya telah menambahkan tampilan di tablerow menggunakan addview(). Ini bekerja dengan baik. Sekarang saya ingin mengatur tinggi dan lebar untuk GraphView. Bagaimana cara melakukannya?

dev_android
sumber

Jawaban:

140

Cara mudah adalah dengan mengatur ukuran secara programatik seperti itu:

graphView.setLayoutParams(new LayoutParams(width, height));

Ini bagus jika Anda tahu ukuran tampilan yang tepat. Namun, jika Anda ingin pendekatan yang lebih fleksibel, Anda dapat mengganti onMeasure()metode untuk mengukur pandangan lebih tepatnya tergantung pada kendala ruang yang tersedia dan tata letak ( wrap_content, match_parent, atau ukuran tetap).

Anda dapat menemukan contoh tentang cara menimpa onMeasure()dengan melihat dokumen Android dan LabelViewsampel di direktori SDK Anda.

Dalma
sumber
16
Akan sangat membantu untuk mengetahui LayoutParams mana yang Anda impor di sana.
user3690202
1
The LayoutParamsharus dari tata letak di mana graphViewditempatkan. Misalnya jika dalam file tata letak XML graphViewditempatkan di dalam RelativeLayout, maka Anda harus menggunakannew RelativeLayout.LayoutParams(width, height)
Vic
208

Anda dapat mengatur tinggi dan lebar seperti ini:

myGraphView.setLayoutParams(new LayoutParams(width, height));
Eric Nordvik
sumber
76
Anda harus memastikan kelas LayoutParam yang Anda gunakan berasal dari kelas Layout induk yang benar. Misalnya, jika GraphView Anda terkandung dalam LinearLayout, Anda perlu menggunakan kelas LinearLayout.LayoutParams.
yincrash
41
Ini juga berfungsi dan memastikan Anda menggunakan kelas LayoutParams yang benar: cukup lakukan myGraphView.getLayoutParams().height = 100;.
sulai
21
Jika Anda melakukannya this.getLayoutParams().height = 100, pastikan untuk mengikutinya this.setLayoutParams(this.getLayoutParams()), jika tidak maka tidak akan melakukan apa-apa (berguna).
Achal Dave
4
Saya pikir ini aneh bahwa jawaban ini mendapatkan lebih banyak poin. Meskipun lebih mudah, itu jauh lebih sedikit modular; jika Anda ingin menggunakan tampilan Anda di tempat yang berbeda, Anda juga perlu melakukan hardcode pada nilai lebar / tinggi di sana. Hati-hati menggunakan ini.
gardarh
1
Terima kasih @rincrash karena menunjukkannya. Tampaknya aneh bahwa saya perlu menggunakan kelas tampilan induk (RelativeLayout dalam kasus saya) alih-alih kelas induk dari tampilan kustom saya (SurfaceView dalam kasus saya)
ericn
75

Anda dapat mengatur tinggi dan lebar tampilan dalam tata letak relatif seperti ini

ViewGroup.LayoutParams params = view.getLayoutParams();
params.height = 130;
view.setLayoutParams(params);
Rakshi
sumber
2
Anda tidak perlu mengatur layoutparam lagi. Itu akan tercermin secara otomatis. Ini adalah keuntungan dari pendekatan berorientasi objek.
Dipendra
8
@Dipendra panggilan ke setLayoutParams()diperlukan karena memanggil metode lain seperti resolveLayoutParams()danrequestLayout()
William
memberikan pengecualian seperti pada onCreate getLayoutParams () adalah nilai nol. Jadi params. pengecualian penyebab
ketinggian
Anda harus merujuk tampilan yang harus Anda atur ketinggiannya. Periksa apakah Anda menunjuk ke tampilan yang sama
Rakshi
1
Mendapatkan layoutParamsinisiasi pada tampilan akan menjadi NPE, tolong jelaskan pada titik mana Anda menjalankan ini?
John Sardinha
6

Di Kotlin Anda dapat mengatur lebar dan tinggi tampilan apa pun secara langsung menggunakan properti virtual mereka:

someView.layoutParams.width = 100
someView.layoutParams.height = 200
gundrabur
sumber
4
spin12.setLayoutParams(new LinearLayout.LayoutParams(200, 120));

spin12adalah pemintal Anda dan 200 , 120 adalah widthdan heightuntuk Anda spinner.

Ujjwal
sumber
3

Ini adalah versi berbasis Kotlin, dengan asumsi bahwa tampilan induk adalah turunan dari LinearLayout.

someView.layoutParams = LinearLayout.LayoutParams(100, 200)

Ini memungkinkan untuk mengatur lebar dan tinggi ( 100dan 200) dalam satu baris.

Morgan Wilde
sumber