簡體   English   中英

Android OnPreferenceClickListener

[英]Android OnPreferenceClickListener

我有一個Activity使用PreferenceFragment顯示設置菜單。 有一種方法可以將Bean的列表傳遞給片段,以便它可以動態生成一個Preference的列表,而我希望將其作為按鈕使用。 我正在嘗試使用OnPreferenceClickListener來響應被單擊的首選項之一,但是我需要讓最外面的Activity知道這一點。 我的代碼如下所示:

public class PairActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        fragment = new SettingsFragment();
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, fragment)
                .commit();
        ...
    }


    public static class SettingsFragment extends PreferenceFragment {
        public void displayBeans(Collection<Bean> beans) {
            ...
            for(Bean bean : beans) {
                Preference pref = new Preference(getActivity());
                pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
                    @Override
                    public boolean onPreferenceClick(Preference preference) {
                        // want to let the Activity know something happened
                    }
                });
            }
        }
    }

    ...
}

注釋顯示了我想從何處到達活動,但它在靜態類內的匿名類內部……我該怎么解決我的問題?

編輯:

使您的 SettingsFragment成為 PairActivity內部類:

 
 
 
  
  public class PairActivity extends Activity { public class SettingsFragment extends PreferenceFragment { } }
 
  

然后,您可以使用 PairActivity.this安全地引用活動。

編輯:

您鏈接的是一個很好的答案,並且確實是這樣使用它的正確方法。 我沒有考慮。

不過,將片段附加到活動后,您可以使用getActivity引用它。 如果您從clickListener內部調用此方法,則片段肯定會附加到活動上,因此可以這樣做:

public class PairActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        fragment = new SettingsFragment();
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, fragment)
                .commit();
        ...
    }


    public static class SettingsFragment extends PreferenceFragment {
        public void displayBeans(Collection<Bean> beans) {
            ...
            for(Bean bean : beans) {
                Preference pref = new Preference(getActivity());
                pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
                    @Override
                    public boolean onPreferenceClick(Preference preference) {
                        PairActivity pairActivity = (PairActivity) getActivity();
                        // Do something with pairActivity instance
                    }
                });
            }
        }
    }

    ...
}

您只需要確保您沒有將片段附加到另一個活動,因為(PairActivity)會引發異常。

暫無
暫無

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

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