精品一区二区三区在线成人,欧美精产国品一二三区,Ji大巴进入女人66h,亚洲春色在线视频

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

移動開發 Android
每個Android開發者都經歷過這樣的噩夢時刻:"明明布局里寫死了200dp寬高,為什么代碼里getWidth()返回0?!"

當View和你玩捉迷藏時...

每個Android開發者都經歷過這樣的噩夢時刻:??

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

就像這個簡單的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);
    // 這里會輸出令人心碎的0/0 ??
    Log.i("尺寸檢測", "寬:" + textView.getWidth() + " 高:" + textView.getHeight());
}

布局舞臺的幕后真相 ??

Android布局就像精心編排的舞臺劇:

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

2. 演員就位 → View實例化:演員到達劇場

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

4. 舞臺布置 → layout():道具位置調整

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

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

Android布局時序表

階段

能否獲取寬高?

布局狀態

onCreate()

? 絕對不行

劇本剛送達

onStart()

? 仍然不行

演員在化妝

onResume()

? 還是不行

彩排剛開始

布局完成后

? 完全OK

演出已就緒

魔法時刻:讓View自己告訴你尺寸

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

為什么這個魔法有效?

view.post()相當于對Android系統說:"嘿,等你不忙的時候告訴我一聲!" 它的工作原理:

1. 把你的代碼打包成"待辦事項"

2. 插入主線程的任務隊列

3. 等待所有布局任務完成

4. 在最佳時機執行你的代碼

200dp變600px的魔法轉換 ??

當你在XML寫200dp時,實際獲取的像素值取決于設備屏幕:

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

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

避坑寶典:開發者必備生存技巧 ??

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

答案:檢查是否使用wrap_content,這時尺寸依賴內容計算,可能延遲更大

? 問題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:有沒有更優雅的方式?

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

場景

解決方案

推薦指數

簡單尺寸獲取

view.post()

?????

實時尺寸監聽

ViewTreeObserver

????

動畫中獲取

onAnimationEnd()

???

自定義View

onSizeChanged()

????

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

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

責任編輯:武曉燕 來源: 沐雨花飛碟
相關推薦

2024-06-19 08:32:13

2017-04-28 09:58:21

AndroidLinearLayou寬高

2011-05-27 09:19:32

Windows 7崩潰

2022-10-27 09:13:58

CSSGradient

2017-01-09 12:57:21

Linux

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開發代碼

2014-08-27 09:51:09

2023-02-15 08:41:56

多層維表性能寬表

2015-04-23 10:15:53

AndroidiOS圖片

2015-04-23 10:52:53

AndroidiOS圖片

2022-08-02 06:39:06

多行文本CSS

2018-05-08 06:51:02

2015-12-03 10:09:31

賭場大數據

2025-01-24 09:02:07

2022-09-19 00:08:22

人工智能機器交通管制

2014-06-05 09:28:26

項目開發程序員
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 乾安县| 康马县| 大厂| 马鞍山市| 沙湾县| 扎鲁特旗| 房山区| 紫云| 手游| 吐鲁番市| 新平| 平武县| 社旗县| 龙泉市| 海兴县| 南澳县| 红桥区| 卢氏县| 若尔盖县| 海盐县| 阜南县| 旌德县| 蓬安县| 普安县| 奉贤区| 南康市| 遂昌县| 延吉市| 封丘县| 依兰县| 富裕县| 华蓥市| 公安县| 图们市| 吴堡县| 高阳县| 定远县| 阜康市| 当阳市| 台南县| 通州区|