[英]Getting null value in fragment spinner
我正在嘗試在 Fragment 中使用過濾器並實現對話框片段。 這是我正在使用的課程
公共類 HomeFragment 擴展 Fragment 實現 FilterDialogFragment.FilterListener, PostAdapter2.OnPostSelectedListener{ 詳細代碼 }
這是用於微調器選擇選項的基於對話框片段的類
公共類 FilterDialogFragment 擴展了 DialogFragment
單擊過濾器按鈕時會調用此方法,該按鈕會彈出過濾器的微調選項對話框
已申報
private FilterDialogFragment mFilterDialog;
在 onCreateView
mFilterDialog = new FilterDialogFragment();
調用方法
public void onFilterClicked(){
mFilterDialog.show(getSupportFragmentManager(), FilterDialogFragment.TAG);
}
在此之后選擇微調器選項並單擊應用此方法被調用,其中mFilterListener為空,這不應該是這種情況
public interface FilterListener {
void onFilter(Filters filters);
}
FilterListener mFilterListener;
public void onSearchClicked() {
Log.d("Message", String.valueOf(mFilterListener));
if (mFilterListener != null) {
Log.d("Message", "New 55555");
mFilterListener.onFilter(getFilters());
}
dismiss();
}
請幫我解決這個問題。 如果需要更多詳細信息,請告訴我
FilterDialogFragement 中的附加方法
public void onAttach(Context context) {
super.onAttach(context);
Log.d("Message", "New 6666666");
Log.d("Message", String.valueOf(mFilterListener));
if (context instanceof FilterListener) {
// Log.d("Message", String.valueOf(mFilterListener));
mFilterListener = (FilterListener) context;
}
}
我假設,你沒有在mFilterDialog
設置監聽mFilterDialog
,所以這就是為什么它為null
您正在嘗試模仿這個庫實現: Friendly Eats 。
但是,您不會批量復制它,主要是因為您選擇使用implements FilterDialogFragment.FilterListener
HomeFragment
來啟動FilterDialogFragment
,而不是庫的MainActivity
。 這是您的空指針的原因。
這是由於getSupportFragmentManager()
工作方式。 如果你查看 Android 的文檔,你會看到它說
返回 FragmentManager 以與與此活動關聯的片段進行交互。 (我的粗體)
當你調用mFilterDialog.show(getSupportFragmentManager(), FilterDialogFragment.TAG);
在HomeFragment
,您實際上是在調用作為HomeFragment
父級的任何Activity
來啟動新的FilterDialogFragment
。 您可以通過檢查onAttach(Context context)
內的HomeFragment
onAttach(Context context)
context instanceof HomeFragment
來仔細檢查這context instanceof HomeFragment
。 我不認為它會返回true
。
為了解決這個問題,並且不改變你對HomeFragment
的使用,你可以簡單地傳遞一個HomeFragment
本身的實例,或者一個單獨的FilterDialogFragment.FilterListener
實現(如果你不需要使用HomeFragment
任何東西而不是監聽器,我更喜歡它) 在創建時或在您啟動它之前添加到您的FilterDialogFragment
實例。
例如,您可以像這樣創建一個公共 setter:
private FilterListener mFilterListener;
public void setFilterListener(FilterListener filterListener){
mFilterListener = filterListener;
}
然后在您的HomeFragment onCreateView()
,您執行以下操作:
mFilterDialog = new FilterDialogFragment();
//Or preferably, an anonymous/named implementing instance of the interface only.
mFilterDialog.setFilterListener(this);
這樣做不會依賴 Android 框架來提供您的字段的初始化,並且不需要您更改您當前使用的Activity
或HomeFragment
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.