我一直在 AndroidStudio 中開發 Android 應用程式。應用程式有 Fragment,我們稱之為 MainFragment,和單獨的 Java 類檔案,我們稱之為 SQLiteControler.class 問題是當我嘗試從 SQLiteController 中的 Fragment 呼叫方法時,我將空物件參考作為錯誤 這里是一些縮小的代碼:
主片段
public class MainFragment extends Fragment {
...
//TextViews & ETC
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_profil, container, false);
return view:
}
public void someMethod(...){
textView.setText("abc");
//somecode
}
}
SQLite控制器
public class SQLiteDataHelper {
private Context context;
MainFragment mainFragment;
public SQLiteDataHelper(Context context){
this.context = context;
mainFragment = new MainFragment();
}
public void anothermethod(){
mainFragment.someMethod(...)
}
}
注意: 這是縮小的代碼
我已經嘗試過一些我的解決方案,比如從 MainFragment & ETC 獲取實體,以及來自 StackOverflow 的更多可能的解決方案,但仍然獲得相同的空物件參考。
uj5u.com熱心網友回復:
您的問題是您的助手類正在創建一個全新的 MainFragment 實體,該實體與顯示的片段沒有關聯(視圖將為空)。
您不應在幫助程式中創建新的片段實體。您應該定義某種介面并使用它來處理這種型別的耦合(或使用 ViewModel 和 LiveData - 首選)。如果你想走自定義介面路線,你可以定義一個這樣的介面:
interface DBDisplayer {
public void showText(String msg);
}
然后你可以讓你的片段實作這個介面:
public class MainFragment extends Fragment implements DBDisplayer {
// I'll assume your helper is a singleton - if not, you'll need to figure
// out how to get an instance of it in your fragment.
private SQLiteDataHelper dbHelper = SQLiteDataHelper.getInstance();
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_profil, container, false);
return view:
}
@Override
public void onResume() {
super.onResume();
dbHelper.setDisplayer(this);
}
@Override
public void onPause() {
super.onPause();
// remove the displayer when the fragment is not being shown
dbHelper.setDisplayer(null);
}
@Override
public void showText(String msg){
textView.setText(msg);
}
}
那么你的控制器應該不依賴于 Fragment,而是接受你定義的介面的一個實體
public class SQLiteDataHelper {
private Context context;
private DBDisplayer displayer = null;
public SQLiteDataHelper(Context context){
this.context = context;
}
public void setDisplayer(DBDisplayer d) {
displayer = d;
}
public void anothermethod(){
if( displayer != null ) {
displayer.showText("some words");
}
}
}
但是,為片段創建一個 ViewModel 會更好,該片段具有用于您要顯示的內容的 LiveData。Fragment 只會觀察 LiveData,而 ViewModel 可以處理查詢資料庫助手并將資料放入 LiveData。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/369842.html
下一篇:在Class范圍內考慮什么?
