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

Android ViewPager 中監聽 Fragment 內 EditText:在 Adapter getItem 設置 TextWatcher

     編輯:程式設計疑難解答

問題

`Activity` 通過 `ViewPager` 加載 3 個 `Fragment`(各自佈局含 `EditText`)。在 `Activity.onCreate` 中直接 `findViewById` 獲取 `EditText` 並 `addTextChangedListener` → **空指針**,因 Fragment 視圖尚未創建。在 Fragment 內部 `Button` 點擊後初始化則正常。

解決方案:在 FragmentPagerAdapter.getItem() 返回 Fragment 後,由 Fragment 自身綁定監聽

public class MyPagerAdapter extends FragmentPagerAdapter {
    @Override
    public Fragment getItem(int position) {
        BaseFragment fragment = fragments[position];
        // 關鍵:在 Fragment 實例化後、視圖創建前,預設監聽邏輯
        fragment.setOnTextChangeListener(new TextWatcher() { ... });
        return fragment;
    }
}

Fragment 基類:

public abstract class BaseFragment extends Fragment {
    private TextWatcher textWatcher;
    public void setOnTextChangeListener(TextWatcher watcher) { this.textWatcher = watcher; }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        EditText et = view.findViewById(R.id.et_input);
        if (textWatcher != null) et.addTextChangedListener(textWatcher);
    }
}

替代方案:接口回調 / ViewModel 共享

  • 定義接口 `OnTextChangeListener`,Fragment 實現,Activity 持有引用。
  • 或用 **共享 ViewModel**(`activityViewModels()`)持有 `MutableLiveData`,Fragment 觀察/更新,Activity 同樣觀察,完全解耦。

核心原則

  • **Fragment 視圖生命週期**:`onCreateView` / `onViewCreated` 才能安全 `findViewById`。
  • Activity 不應直接操作 Fragment 內部 View,應通過 Fragment 公開方法或共享數據層。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved