首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android ViewPager 動態存取 inflated View 元件:解決 findViewById 回傳 null

     編輯:程式設計綜合問答

問題場景

自訂 PagerAdapter 在 instantiateItem 中 inflate 佈局,但在 Activity.onCreate 中呼叫 findViewById(R.id.myButton) 卻得到 null。

根本原因

  1. ViewPager 尚未設定 Adapter,子視圖未建立。
  2. Activity 的佈局僅包含 ViewPager,按鈕位於子頁面佈局(layout1.xml),不在 Activity 的視圖樹中。

正確做法

1. 先設定 Adapter

ViewPager viewPager = findViewById(R.id.viewPagerLayout);
viewPager.setAdapter(new CustomPagerAdapter());

2. 在 Adapter 內部存取子視圖元件

@Override
public Object instantiateItem(ViewGroup container, int position) {
    LayoutInflater inflater = LayoutInflater.from(container.getContext());
    View view = inflater.inflate(position == 0 ? R.layout.layout1 : R.layout.layout2, container, false);
    container.addView(view);

    // 在這裡 findViewById,view 為當前頁面根視圖
    Button btn = view.findViewById(R.id.myButton);
    btn.setOnClickListener(v -> { /* 處理點擊 */ });
    return view;
}

3. 若需在 Activity 中操作,可透過介面回呼

public interface OnPageButtonClickListener {
    void onButtonClick(int position);
}

// Adapter 建構子傳入 listener
// instantiateItem 內 btn.setOnClickListener(v -> listener.onPageButtonClick(position));

關鍵點總結

  • ViewPager 的子視圖由 PagerAdapter 管理,不在 Activity 佈局層級。
  • 一定要在 instantiateItem 回傳的 View 上呼叫 findViewById。
  • 勿在 onCreate 直接尋找子頁面元件。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved