偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

揭秘Android開發(fā)的"尺寸消失術(shù)":為什么你獲取的View寬高總是0?

移動(dòng)開發(fā) Android
每個(gè)Android開發(fā)者都經(jīng)歷過這樣的噩夢(mèng)時(shí)刻:"明明布局里寫死了200dp寬高,為什么代碼里getWidth()返回0?!"

當(dāng)View和你玩捉迷藏時(shí)...

每個(gè)Android開發(fā)者都經(jīng)歷過這樣的噩夢(mèng)時(shí)刻:??

"明明布局里寫死了200dp寬高,為什么代碼里getWidth()返回0?!"

就像這個(gè)簡單的TextView:

<!-- 信心滿滿的布局聲明 -->
<TextView
    android:id="@+id/textView"
    android:layout_width="200dp"
    android:layout_height="200dp"/>

然后在Activity里興沖沖地獲取尺寸:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    TextView textView = findViewById(R.id.textView);
    // 這里會(huì)輸出令人心碎的0/0 ??
    Log.i("尺寸檢測(cè)", "寬:" + textView.getWidth() + " 高:" + textView.getHeight());
}

布局舞臺(tái)的幕后真相 ??

Android布局就像精心編排的舞臺(tái)劇:

1. 劇本編寫 → setContentView():導(dǎo)演拿到劇本

2. 演員就位 → View實(shí)例化:演員到達(dá)劇場(chǎng)

3. 站位彩排 → measure():確定演員站位

4. 舞臺(tái)布置 → layout():道具位置調(diào)整

5. 正式演出 → draw():大幕拉開

致命錯(cuò)誤:如果在彩排階段就向演員要站位尺寸——當(dāng)然拿不到!

Android布局時(shí)序表

階段

能否獲取寬高?

布局狀態(tài)

onCreate()

? 絕對(duì)不行

劇本剛送達(dá)

onStart()

? 仍然不行

演員在化妝

onResume()

? 還是不行

彩排剛開始

布局完成后

? 完全OK

演出已就緒

魔法時(shí)刻:讓View自己告訴你尺寸

// 拯救世界的解決方案
textView.post(new Runnable() {
    @Override
    public void run() {
        // 這里一定能獲取到真實(shí)尺寸!
        int realWidth= textView.getWidth();
        int realHeight= textView.getHeight();
        Log.i("正確尺寸", "寬:" + realWidth + " 高:" + realHeight);
    }
});

為什么這個(gè)魔法有效?

view.post()相當(dāng)于對(duì)Android系統(tǒng)說:"嘿,等你不忙的時(shí)候告訴我一聲!" 它的工作原理:

1. 把你的代碼打包成"待辦事項(xiàng)"

2. 插入主線程的任務(wù)隊(duì)列

3. 等待所有布局任務(wù)完成

4. 在最佳時(shí)機(jī)執(zhí)行你的代碼

200dp變600px的魔法轉(zhuǎn)換 ??

當(dāng)你在XML寫200dp時(shí),實(shí)際獲取的像素值取決于設(shè)備屏幕:

// 揭秘屏幕密度的代碼
DisplayMetrics metrics = getResources().getDisplayMetrics();
float density = metrics.density; // 密度系數(shù)
int px = (int)(200 * density);  // 實(shí)際像素值

Log.d("像素魔法", "200dp = " + px + "px");

避坑寶典:開發(fā)者必備生存技巧 ??

? 問題1:為什么有時(shí)候用post還是0?

答案:檢查是否使用wrap_content,這時(shí)尺寸依賴內(nèi)容計(jì)算,可能延遲更大

? 問題2:Fragment里怎么處理?

@Override
public void onViewCreated(View view, Bundle state) {
    View textView = view.findViewById(R.id.textView);
    textView.post(() -> {
        // Fragment中的正確獲取方式
        Log.d("尺寸", textView.getWidth() + "x" + textView.getHeight());
    });
}

? 問題3:有沒有更優(yōu)雅的方式?

// 使用ViewTreeObserver避免創(chuàng)建多余線程
textView.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            textView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            // 布局完成時(shí)自動(dòng)觸發(fā)
            Log.i("優(yōu)雅獲取", "實(shí)時(shí)尺寸:" + textView.getWidth());
        }
    }
);

場(chǎng)景

解決方案

推薦指數(shù)

簡單尺寸獲取

view.post()

?????

實(shí)時(shí)尺寸監(jiān)聽

ViewTreeObserver

????

動(dòng)畫中獲取

onAnimationEnd()

???

自定義View

onSizeChanged()

????

??Pro提示:在Kotlin中可以使用doOnLayout{ }擴(kuò)展函數(shù),更簡潔!

掌握了這些技巧,再也不用擔(dān)心View和你玩捉迷藏啦!

責(zé)任編輯:武曉燕 來源: 沐雨花飛碟
相關(guān)推薦

2024-06-19 08:32:13

2017-04-28 09:58:21

AndroidLinearLayou寬高

2011-05-27 09:19:32

Windows 7崩潰

2017-01-09 12:57:21

Linux

2022-10-27 09:13:58

CSSGradient

2021-09-26 08:35:17

Android控件寬高

2012-11-16 14:57:25

2018-06-25 08:32:28

高通IT芯片

2021-02-16 00:33:56

Python語言工具

2020-05-13 09:03:14

Python開發(fā)代碼

2014-08-27 09:51:09

2023-02-15 08:41:56

多層維表性能寬表

2015-04-23 10:52:53

AndroidiOS圖片

2015-04-23 10:15:53

AndroidiOS圖片

2022-08-02 06:39:06

多行文本CSS

2018-05-08 06:51:02

2015-12-03 10:09:31

賭場(chǎng)大數(shù)據(jù)

2025-01-24 09:02:07

2022-09-19 00:08:22

人工智能機(jī)器交通管制

2014-06-05 09:28:26

項(xiàng)目開發(fā)程序員
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)