簡體   English   中英

在片段微調器中獲取空值

[英]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 框架來提供您的字段的初始化,並且不需要您更改您當前使用的ActivityHomeFragment

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM