Saya memiliki pandangan TableLayout, TableRow and TextView
. Saya ingin itu terlihat seperti kotak. Saya perlu mendapatkan tinggi dan lebar dari kisi ini. Metode getHeight()
dan getWidth()
selalu kembali 0. Ini terjadi ketika saya memformat grid secara dinamis dan juga ketika saya menggunakan versi XML.
Bagaimana cara mengambil dimensi untuk tampilan?
Ini adalah program pengujian saya yang saya gunakan di Debug untuk memeriksa hasilnya:
import android.app.Activity;
import android.os.Bundle;
import android.widget.TableLayout;
import android.widget.TextView;
public class appwig extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.maindemo); //<- includes the grid called "board"
int vh = 0;
int vw = 0;
//Test-1 used the xml layout (which is displayed on the screen):
TableLayout tl = (TableLayout) findViewById(R.id.board);
tl = (TableLayout) findViewById(R.id.board);
vh = tl.getHeight(); //<- getHeight returned 0, Why?
vw = tl.getWidth(); //<- getWidth returned 0, Why?
//Test-2 used a simple dynamically generated view:
TextView tv = new TextView(this);
tv.setHeight(20);
tv.setWidth(20);
vh = tv.getHeight(); //<- getHeight returned 0, Why?
vw = tv.getWidth(); //<- getWidth returned 0, Why?
} //eof method
} //eof class
getHeight()
dangetWidth()
setelah siklus hidup Activity meminta pandangan untuk mengukur diri mereka sendiri, dengan kata lain, lakukan hal-hal semacam inionResume()
dan hanya itu. Anda seharusnya tidak mengharapkan objek yang belum ditata untuk mengetahui dimensinya, itulah keseluruhan triknya. Tidak perlu sihir yang disarankan di bawah ini.getHeight()/Width()
dionResume()
tidak menghasilkan> 0 nilai bagi saya.Jawaban:
Saya percaya OP sudah lama hilang, tetapi jika jawaban ini dapat membantu pencari masa depan, saya pikir saya akan memposting solusi yang saya temukan. Saya telah menambahkan kode ini ke
onCreate()
metode saya :Diedit: 07/05/11 untuk memasukkan kode dari komentar:
Pertama saya mendapatkan referensi terakhir ke
TextView
(untuk mengakses dalamonGlobalLayout()
metode) saya. Selanjutnya, saya mendapatkanViewTreeObserver
dari sayaTextView
, dan menambahkanOnGlobalLayoutListener
, overridingonGLobalLayout
(sepertinya tidak ada metode superclass untuk memanggil di sini ...) dan menambahkan kode saya yang membutuhkan mengetahui pengukuran tampilan ke pendengar ini. Semua berfungsi seperti yang diharapkan untuk saya, jadi saya berharap ini bisa membantu.sumber
tv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
begitu pendengar harus dihapus setelah pertama kali ini terjadi.addOnLayoutChangeListener
karya juga! :)Saya hanya akan menambahkan solusi alternatif, menimpa metode onWindowFocusChanged aktivitas Anda dan Anda akan bisa mendapatkan nilai getHeight (), getWidth () dari sana.
sumber
ViewTreeObserver
.Anda mencoba mendapatkan lebar dan tinggi elemen, yang belum digambar.
Jika Anda menggunakan debug dan berhenti di beberapa titik, Anda akan melihat, bahwa layar perangkat Anda masih kosong, itu karena elemen Anda belum digambar, sehingga Anda tidak bisa mendapatkan lebar dan tinggi sesuatu, itu belum ada.
Dan, saya mungkin salah, tetapi
setWidth()
tidak selalu dihormati,Layout
menjabarkan itu anak-anak dan memutuskan bagaimana mengukur mereka (memanggilchild.measure()
), jadi Jika Anda mengatursetWidth()
, Anda tidak dijamin untuk mendapatkan lebar ini setelah elemen akan ditarik.Yang Anda butuhkan adalah menggunakannya
getMeasuredWidth()
(ukuran terbaru dari Tampilan Anda) di suatu tempat setelah tampilan tersebut benar-benar dibuat.Memeriksa
Activity
siklus hidup untuk menemukan momen terbaik.http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle
Saya percaya praktik yang baik adalah menggunakan
OnGlobalLayoutListener
seperti ini:Anda dapat menempatkan kode ini secara langsung
onCreate()
, dan akan dipanggil ketika tampilan akan ditata.sumber
Gunakan metode posting Lihat seperti ini
sumber
Saya mencoba menggunakan
onGlobalLayout()
untuk melakukan beberapa format kustomTextView
, tetapi seperti yang diperhatikan @George Bailey,onGlobalLayout()
memang disebut dua kali: sekali di jalur tata letak awal, dan kedua kalinya setelah memodifikasi teks.View.onSizeChanged()
berfungsi lebih baik untuk saya karena jika saya memodifikasi teks di sana, metode ini dipanggil hanya sekali (selama pass tata letak). Subklasifikasi ini diperlukanTextView
, tetapi pada API Level 11+View. addOnLayoutChangeListener()
dapat digunakan untuk menghindari subklasifikasi.Satu hal lagi, untuk mendapatkan lebar tampilan yang benar
View.onSizeChanged()
,layout_width
harus diatur kematch_parent
, bukanwrap_content
.sumber
Apakah Anda mencoba untuk mendapatkan ukuran dalam konstruktor, atau metode lain yang dijalankan sebelum Anda mendapatkan gambar yang sebenarnya?
Anda tidak akan mendapatkan dimensi apa pun sebelum semua komponen benar-benar diukur (karena xml Anda tidak tahu tentang ukuran tampilan, posisi orang tua, dan apa pun)
Coba dapatkan nilai setelah onSizeChanged () (meskipun dapat dipanggil dengan nol), atau cukup menunggu ketika Anda akan mendapatkan gambar yang sebenarnya.
sumber
Seperti yang disebutkan FX, Anda dapat menggunakan a
OnLayoutChangeListener
untuk tampilan yang ingin Anda lacak sendiriAnda dapat menghapus pendengar di dalam panggilan balik jika Anda hanya menginginkan tata letak awal.
sumber
Saya kira inilah yang perlu Anda perhatikan: gunakan
onSizeChanged()
pandangan Anda. Berikut adalah potongan kode EXTENDED tentang cara menggunakanonSizeChanged()
untuk mendapatkan tata letak Anda atau melihat ini tinggi dan lebar dinamis http://syedrakibalhasan.blogspot.com/2011/02/how-to-get-width-and-height-dimensions.htmlsumber
ViewTreeObserver
danonWindowFocusChanged()
sama sekali tidak perlu.Jika Anda mengembang
TextView
tata letak sebagai dan / atau menaruh beberapa konten di dalamnya dan mengaturLayoutParams
maka Anda dapat menggunakangetMeasuredHeight()
dangetMeasuredWidth()
.TETAPI Anda harus berhati-hati dengan
LinearLayouts
(mungkin juga yang lainViewGroups
). Masalahnya ada, bahwa Anda bisa mendapatkan lebar dan tinggi setelahonWindowFocusChanged()
tetapi jika Anda mencoba untuk menambahkan beberapa tampilan di dalamnya, maka Anda tidak bisa mendapatkan informasi itu sampai semuanya telah diambil. Saya mencoba menambahkan beberapaTextViews
untukLinearLayouts
meniruFlowLayout
(gaya pembungkus) dan tidak bisa digunakanListeners
. Setelah proses dimulai, itu harus dilanjutkan secara sinkron. Jadi dalam kasus seperti itu, Anda mungkin ingin menjaga lebar dalam variabel untuk menggunakannya nanti, karena saat menambahkan tampilan ke tata letak, Anda mungkin membutuhkannya.sumber
Meskipun solusi yang diusulkan berfungsi, itu mungkin bukan solusi terbaik untuk setiap kasus karena berdasarkan pada dokumentasi untuk
ViewTreeObserver.OnGlobalLayoutListener
yang berarti dipanggil berkali-kali dan tidak selalu dilihat diukur (memiliki tinggi dan lebar ditentukan)
Alternatif adalah menggunakan
ViewTreeObserver.OnPreDrawListener
yang dipanggil hanya ketika tampilan siap untuk diambil dan memiliki semua pengukurannya.sumber
Anda sebaiknya melihat pada Lihat siklus hidup: http://developer.android.com/reference/android/view/View.html Umumnya Anda tidak akan tahu lebar dan tinggi pasti sampai aktivitas Anda datang ke keadaan onResume.
sumber
Anda dapat menggunakan siaran yang disebut di OnResume ()
Sebagai contoh:
Anda tidak bisa mendapatkan ketinggian tampilan di OnCreate (), onStart (), atau bahkan di onResume () karena alasan kcoppock merespons
sumber
Tinggi dan lebar adalah nol karena tampilan belum dibuat pada saat Anda meminta tinggi dan lebar. Salah satu solusi paling sederhana adalah
Metode ini baik dibandingkan dengan metode lain karena pendek dan garing.
sumber
Tanggapan Sederhana: Ini bekerja untuk saya tanpa masalah. Tampaknya kuncinya adalah memastikan bahwa Tampilan memiliki fokus sebelum Anda mendapatkanHeight dll. Lakukan ini dengan menggunakan metode hasFocus (), kemudian gunakan metode getHeight () dalam urutan itu. Diperlukan hanya 3 baris kode.
ImageButton myImageButton1 =(ImageButton)findViewById(R.id.imageButton1);
myImageButton1.hasFocus();
int myButtonHeight = myImageButton1.getHeight();
Log.d("Button Height: ", ""+myButtonHeight );//Not required
Semoga ini bisa membantu.
sumber
Gunakan getMeasuredWidth () dan getMeasuredHeight () untuk tampilan Anda.
Panduan pengembang: Lihat
sumber
KOREKSI: Saya menemukan bahwa solusi di atas mengerikan. Apalagi saat ponsel Anda lambat. Dan di sini, saya menemukan solusi lain: menghitung nilai px elemen, termasuk margin dan bantalan: dp ke px: https://stackoverflow.com/a/6327095/1982712
atau dimens.xml ke px: https://stackoverflow.com/a/16276351/1982712
sp to px: https://stackoverflow.com/a/9219417/1982712 (membalikkan solusinya)
atau dimens ke px: https://stackoverflow.com/a/16276351/1982712
dan hanya itu.
sumber