gpt4 book ai didi

android - 在带有选项卡的 SherlockFragmentActivity 中使用 PreferenceFragment

转载 作者:太空狗 更新时间:2023-10-29 14:21:56 27 4
gpt4 key购买 nike

我正在尝试使用 ABS 进行选项卡式 Activity SherlockFragmentActivity 与 ViewPager,并希望其中一个选项卡包含首选项 Activity/fragment 。

由于 ABS 没有 SherlockPreferenceFragment 或对 PreferenceFragment 的任何类型的支持,我 found使用 UnifiedPreference 的可能解决方案

UnifiedPreference 独立运行,演示效果很好,但如果我尝试在我的 ActionBarSherlock 支持的选项卡中实现它,它会崩溃并显示消息:

04-18 03:59:26.000: E/AndroidRuntime(8437): FATAL EXCEPTION: main
04-18 03:59:26.000: E/AndroidRuntime(8437): java.lang.ClassCastException: si.neanonimen.Settings$NetSettingsPrefsFragment cannot be cast to android.support.v4.app.Fragment
04-18 03:59:26.000: E/AndroidRuntime(8437): at android.support.v4.app.Fragment.instantiate(Fragment.java:384)

看起来 UnifiedPreferenceFragment 没有扩展 android.support.v4.app.Fragment。有没有办法解决?有没有人设法得到一个工作示例?

我当前的代码是:

设置:

public class Settings extends UnifiedSherlockPreferenceActivity {

public static String tag = "Settings";

@Override
public void onCreate(Bundle savedInstanceState) {
setHeaderRes(R.xml.pref_headers);
super.onCreate(savedInstanceState);
}

public static class NetSettingsPrefsFragment extends UnifiedPreferenceFragment {}
}

标签式 Activity :

public class FragmentTabs extends SherlockFragmentActivity {
private TabHost mTabHost;
private ViewPager mViewPager;
private TabsAdapter mTabsAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.fragment_tabs);
mTabHost = (TabHost) findViewById(android.R.id.tabhost);
mTabHost.setup();

mViewPager = (ViewPager) findViewById(R.id.pager);

mTabsAdapter = new TabsAdapter(this, mTabHost, mViewPager);

// obviously THIS is the problem
mTabsAdapter.addTab(mTabHost.newTabSpec("settings").setIndicator("Nastavitve"), Settings.NetSettingsPrefsFragment.class, null);

if (savedInstanceState != null) {
mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
}
}

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("tab", mTabHost.getCurrentTabTag());
}

public static class TabsAdapter extends FragmentPagerAdapter implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener {
private final Context mContext;
private final TabHost mTabHost;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();

static final class TabInfo {
//private final String tag;
private final Class<?> clss;
private final Bundle args;

TabInfo(String _tag, Class<?> _class, Bundle _args) {
//tag = _tag;
clss = _class;
args = _args;
}
}

static class DummyTabFactory implements TabHost.TabContentFactory {
private final Context mContext;

public DummyTabFactory(Context context) {
mContext = context;
}

@Override
public View createTabContent(String tag) {
View v = new View(mContext);
v.setMinimumWidth(0);
v.setMinimumHeight(0);
return v;
}
}

public TabsAdapter(FragmentActivity activity, TabHost tabHost, ViewPager pager) {
super(activity.getSupportFragmentManager());
mContext = activity;
mTabHost = tabHost;
mViewPager = pager;
mTabHost.setOnTabChangedListener(this);
mViewPager.setAdapter(this);
mViewPager.setOnPageChangeListener(this);
}

public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) {
tabSpec.setContent(new DummyTabFactory(mContext));
String tag = tabSpec.getTag();

TabInfo info = new TabInfo(tag, clss, args);
mTabs.add(info);
mTabHost.addTab(tabSpec);
notifyDataSetChanged();
}

@Override
public int getCount() {
return mTabs.size();
}

@Override
public Fragment getItem(int position) {
TabInfo info = mTabs.get(position);
return Fragment.instantiate(mContext, info.clss.getName(), info.args);
}

@Override
public void onTabChanged(String tabId) {
int position = mTabHost.getCurrentTab();
mViewPager.setCurrentItem(position);
}

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

@Override
public void onPageSelected(int position) {
// Unfortunately when TabHost changes the current tab, it kindly
// also takes care of putting focus on it when not in touch mode.
// The jerk.
// This hack tries to prevent this from pulling focus out of our
// ViewPager.
TabWidget widget = mTabHost.getTabWidget();
int oldFocusability = widget.getDescendantFocusability();
widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
mTabHost.setCurrentTab(position);
widget.setDescendantFocusability(oldFocusability);
}

@Override
public void onPageScrollStateChanged(int state) {}
}
}

最佳答案

我还需要在 Honeycomb(API 级别 11)之前的 Android 版本中实现 PreferenceFragment。正如您已经拥有的那样,我找到了 UnifiedPreference 库,但查看源代码我发现 UnifiedPreferenceFragment 从官方 Android API 扩展了 PreferenceFragment,因此不适用于

这是我在那里找到的另一个类,但我还没有测试过:

希望对您有所帮助!

您找到其他解决方案了吗?希望 Android 用户尽快将此类添加到支持库中!

干杯,

关于android - 在带有选项卡的 SherlockFragmentActivity 中使用 PreferenceFragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16081706/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com