直接上代码有时间具体分析:
1、MainActivity.java
public class MainActivity extends FragmentActivity implements
OnPageChangeListener {
private int mActionBarOptions;
private ViewPager mViewPager;
private View mCustomView;
private ImageView mScroll1;
private ImageView mScroll2;
private ImageView mScroll3;
private ImageView mScroll4;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_tab_on_top_content);
mViewPager = (ViewPager) findViewById(R.id.pager);
// mViewPager
// .setAdapter(new ViewPagerAdapter(getSupportFragmentManager()));
mViewPager.setAdapter(new PagerAdapter(getSupportFragmentManager(),
this));
mViewPager.setOnPageChangeListener(this);
// 设置页面分隔线
mViewPager.setPageMargin(6);
mViewPager
.setPageMarginDrawable(android.R.drawable.divider_horizontal_bright);
// 自定义 Tab View,并添加到ActionBar上(未设置DisplayOptions,不会显示)
mCustomView = LayoutInflater.from(this).inflate(
R.layout.custom_tab_view, null);
// getParent().getActionBar().setCustomView(mCustomView);
getActionBar().setCustomView(mCustomView);
mScroll1 = (ImageView) mCustomView.findViewById(R.id.scroll_1);
mScroll2 = (ImageView) mCustomView.findViewById(R.id.scroll_2);
mScroll3 = (ImageView) mCustomView.findViewById(R.id.scroll_3);
mScroll4 = (ImageView) mCustomView.findViewById(R.id.scroll_4);
}
@Override
protected void onResume() {
super.onResume();
ActionBar actionBar = getActionBar();
mActionBarOptions = actionBar.getDisplayOptions();
// 设置DisplayOptions,显示ActionBar自定义的View
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
ActionBar.DISPLAY_SHOW_CUSTOM | mActionBarOptions);
setCurrentScroll(mViewPager.getCurrentItem());
}
@Override
protected void onPause() {
super.onPause();
getActionBar().setDisplayOptions(mActionBarOptions,
ActionBar.DISPLAY_SHOW_CUSTOM | mActionBarOptions);
}
public void onTabClick(View view) {
Log.d("TAG", "onTabClick" + view.getId());
switch (view.getId()) {
case R.id.tab_text_1:
mViewPager.setCurrentItem(0, false);
break;
case R.id.tab_text_2:
mViewPager.setCurrentItem(1, false);
break;
case R.id.tab_text_3:
mViewPager.setCurrentItem(2, false);
break;
case R.id.tab_text_4:
mViewPager.setCurrentItem(3, false);
break;
}
}
private void setCurrentScroll(int selection) {
if (mScroll1 != null && mScroll2 != null && mScroll3 != null
&& mScroll4 != null) {
mScroll1.setVisibility(selection == 0 ? View.VISIBLE
: View.INVISIBLE);
mScroll2.setVisibility(selection == 1 ? View.VISIBLE
: View.INVISIBLE);
mScroll3.setVisibility(selection == 2 ? View.VISIBLE
: View.INVISIBLE);
mScroll4.setVisibility(selection == 3 ? View.VISIBLE
: View.INVISIBLE);
}
}
@Override
public void onPageScrollStateChanged(int arg0) {
Log.d("ActiontBar", "onPageScrollStateChanged");
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
Log.d("ActiontBar", "onPageScrolled");
}
@Override
public void onPageSelected(int arg0) {
setCurrentScroll(arg0);
Log.d("ActiontBar", "onPageSelected");
}
public class PagerAdapter extends FragmentPagerAdapter {
PreferenceFragment[] fragments;
String[] titles;
public PagerAdapter(FragmentManager fm, Context context) {
super(fm);
fragments = new PreferenceFragment[4];
fragments[0] = new PreferenceFragment(R.xml.settings_security);
fragments[1] = new PreferenceFragment(R.xml.settings_delay);
fragments[2] = new PreferenceFragment(R.xml.settings_others);
fragments[3] = new PreferenceFragment(R.xml.settings_about);
titles = new String[4];
titles[0] = context.getString(R.string.security);
titles[1] = context.getString(R.string.delay);
titles[2] = context.getString(R.string.others);
titles[3] = context.getString(R.string.about);
}
@Override
public Fragment getItem(int position) {
return (Fragment) fragments[position];
}
@Override
public int getCount() {
return fragments.length;
}
@Override
public String getPageTitle(int position) {
return titles[position];
}
}
}
PreferenceFragment.java
public class PreferenceFragment extends ListFragment {
private PreferenceManager mPreferenceManager;
/**
* The starting request code given out to preference framework.
*/
private static final int FIRST_REQUEST_CODE = 100;
private static final int MSG_BIND_PREFERENCES = 0;
private ListView lv;
private int xmlId;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_BIND_PREFERENCES:
bindPreferences();
break;
}
}
};
// must be provided
// public PreferenceFragment() {
//
// }
public PreferenceFragment(int xmlId) {
this.xmlId = xmlId;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle b) {
postBindPreferences();
return lv;
}
@Override
public void onDestroyView() {
super.onDestroyView();
ViewParent p = lv.getParent();
if (p != null) {
((ViewGroup) p).removeView(lv);
}
}
@Override
public void onCreate(Bundle b) {
super.onCreate(b);
if (b != null) {
xmlId = b.getInt("xml");
}
mPreferenceManager = onCreatePreferenceManager();
lv = (ListView) LayoutInflater.from(getActivity()).inflate(
R.layout.preference_list_content, null);
lv.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
addPreferencesFromResource(xmlId);
postBindPreferences();
}
@Override
public void onStop() {
super.onStop();
try {
Method method = PreferenceManager.class
.getDeclaredMethod("dispatchActivityStop");
method.setAccessible(true);
method.invoke(mPreferenceManager);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onDestroy() {
super.onDestroy();
lv = null;
try {
Method method = PreferenceManager.class
.getDeclaredMethod("dispatchActivityDestroy");
method.setAccessible(true);
method.invoke(mPreferenceManager);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putInt("xml", xmlId);
super.onSaveInstanceState(outState);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try {
Method method = PreferenceManager.class.getDeclaredMethod(
"dispatchActivityResult", int.class, int.class,
Intent.class);
method.setAccessible(true);
method.invoke(mPreferenceManager, requestCode, resultCode, data);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Posts a message to bind the preferences to the list view.
* <p>
* Binding late is preferred as any custom preference types created in
* {@link #onCreate(Bundle)} are able to have their views recycled.
*/
private void postBindPreferences() {
if (mHandler.hasMessages(MSG_BIND_PREFERENCES)) {
return;
}
mHandler.obtainMessage(MSG_BIND_PREFERENCES).sendToTarget();
}
private void bindPreferences() {
final PreferenceScreen preferenceScreen = getPreferenceScreen();
if (preferenceScreen != null) {
preferenceScreen.bind(lv);
}
}
/**
* Creates the {@link PreferenceManager}.
*
* @return The {@link PreferenceManager} used by this activity.
*/
private PreferenceManager onCreatePreferenceManager() {
try {
Constructor<PreferenceManager> c = PreferenceManager.class
.getDeclaredConstructor(Activity.class, int.class);
c.setAccessible(true);
PreferenceManager preferenceManager = c.newInstance(
this.getActivity(), FIRST_REQUEST_CODE);
return preferenceManager;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* Returns the {@link PreferenceManager} used by this activity.
*
* @return The {@link PreferenceManager}.
*/
public PreferenceManager getPreferenceManager() {
return mPreferenceManager;
}
/**
* Sets the root of the preference hierarchy that this activity is showing.
*
* @param preferenceScreen
* The root {@link PreferenceScreen} of the preference hierarchy.
*/
public void setPreferenceScreen(PreferenceScreen preferenceScreen) {
try {
Method method = PreferenceManager.class.getDeclaredMethod(
"setPreferences", PreferenceScreen.class);
method.setAccessible(true);
boolean result = (Boolean) method.invoke(mPreferenceManager,
preferenceScreen);
if (result && preferenceScreen != null) {
postBindPreferences();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Gets the root of the preference hierarchy that this activity is showing.
*
* @return The {@link PreferenceScreen} that is the root of the preference
* hierarchy.
*/
public PreferenceScreen getPreferenceScreen() {
try {
Method method = PreferenceManager.class
.getDeclaredMethod("getPreferenceScreen");
method.setAccessible(true);
return (PreferenceScreen) method.invoke(mPreferenceManager);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* Adds preferences from activities that match the given {@link Intent}.
*
* @param intent
* The {@link Intent} to query activities.
*/
public void addPreferencesFromIntent(Intent intent) {
throw new RuntimeException("too lazy to include this bs");
}
/**
* Inflates the given XML resource and adds the preference hierarchy to the
* current preference hierarchy.
*
* @param preferencesResId
* The XML resource ID to inflate.
*/
public void addPreferencesFromResource(int preferencesResId) {
try {
Method method = PreferenceManager.class.getDeclaredMethod(
"inflateFromResource", Context.class, int.class,
PreferenceScreen.class);
method.setAccessible(true);
PreferenceScreen prefScreen = (PreferenceScreen) method.invoke(
mPreferenceManager, getActivity(), preferencesResId,
getPreferenceScreen());
setPreferenceScreen(prefScreen);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Finds a {@link Preference} based on its key.
*
* @param key
* The key of the preference to retrieve.
* @return The {@link Preference} with the key, or null.
* @see PreferenceGroup#findPreference(CharSequence)
*/
public Preference findPreference(CharSequence key) {
if (mPreferenceManager == null) {
return null;
}
return mPreferenceManager.findPreference(key);
}
public interface OnPreferenceAttachedListener {
public void onPreferenceAttached(PreferenceScreen root, int xmlId);
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ttdevs.actionbarandpreferencefragmentdemo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.DeviceDefault.Light" >
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="singleTask" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
其他配置文件略
2、效果图如下:
3、demo下载: