成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

揭秘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控件寬高

2018-06-25 08:32:28

高通IT芯片

2012-11-16 14:57:25

2021-02-16 00:33:56

Python語言工具

2014-08-27 09:51:09

2020-05-13 09:03:14

Python開發代碼

2023-02-15 08:41:56

多層維表性能寬表

2022-08-02 06:39:06

多行文本CSS

2015-04-23 10:15:53

AndroidiOS圖片

2015-04-23 10:52:53

AndroidiOS圖片

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技術棧公眾號

主站蜘蛛池模板: 一区二区三区影院 | 日韩欧美手机在线 | 成人免费大片黄在线播放 | 蜜臀久久99精品久久久久野外 | 日韩一级 | 欧美 日韩 亚洲91麻豆精品 | 夜夜操天天艹 | 日韩一级不卡 | 欧美成人激情 | 羞羞视频一区二区 | 超级碰在线 | 久久综合色综合 | 青娱乐自拍 | 国产在线播放一区二区三区 | 国产精品美女一区二区 | 日日干干夜夜 | 麻豆视频国产在线观看 | 中文字幕久久精品 | 日韩av在线一区 | 午夜免费网站 | 国产精品视频一区二区三区不卡 | 金莲网 | 亚洲中午字幕 | 亚洲女人的天堂 | 狠狠爱综合 | h在线免费观看 | 国产高清视频一区二区 | 欧美久| 成人伊人 | 国产视频h | 日韩视频免费在线 | 狠狠操婷婷 | 久久综合九九 | 成人国产在线视频 | 国产欧美在线 | 国产小视频在线 | 午夜av电影| 亚洲www啪成人一区二区麻豆 | 天天操天天摸天天爽 | 视频在线亚洲 | 色婷婷av一区二区三区软件 |