日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android4.0设置界面修改总结

發布時間:2025/3/8 Android 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android4.0设置界面修改总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>> ??

筆者前段時間完成設置的圓角item風格的修改,但最近,客戶新增需求,想把設置做成Tab風格的,沒辦法,顧客就是上帝,咱得改啊。今天算是初步改完了,趁著測試緊張測試的空隙,趕緊寫寫博客,梳理一下,一來是給自己記個筆記,二來希望給有需要的朋友一點幫助。

修改主要是兩個點:

①.圓角item的實現。

②.Tab風格的實現。


先來看看下面粗糙的效果圖:


我們都知道,Android從3.0開始加入了Fragment,這大大的減少了Activity的使用,在4.0的設置中尤其發揮的淋漓盡致,幾乎整個設置應用的一級、二級設置菜單就屬于一個Activity即Settings.java。我們能看到不同的設置項,其實就是更換不同的Fragment,表面上是顯得很簡潔明了,但是修改起來還是有點蛋疼了,一點小改動就有可能牽扯一大部分功能,引起一堆bug。

  • 圓角item的實現:

其實這種圓角的item有兩種類型,一種是一直都有的Preference,另外一種是從3.0開始添加的Header。比如設置的第一個主界面使用的就是Header(第一、二張圖片所示),其二級、三級菜單就是Preference(第三張圖片所示)了,不管是哪種類型,他們都是基于ListView實現的,理解了這個原理,修改起來就簡單了,只用在ListView的Adapter的getView函數中,修改對應item項的背景圖片即可。觀察圓角item的背景圖片我們可以發現,先要準備四種背景圖片:頂部(上圓下方)、中間(上下都方)、底部(上方下圓)和單獨(上下都圓)。

由于Header和Preference還是有一點區別的,Header使用頻率沒有Preference高,因此,我這里就沒有在framework層修改Header,只是在需要用到的地方再修改。所以重點說一下Preference。

在源碼中找到:frameworks/base/core/java/android/preference/PreferenceGroupAdapter.java,這個就是Preference的Adapter,首先聲明4種類型的背景,然后通過計算得知那一項需要替換成對應的背景圖片,最后在getView函數中,把對應的item的背景替換成我們需要的,下面是源碼,加上liweiping標簽的就是我的修改:

/** Copyright (C) 2007 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package android.preference;import java.util.ArrayList; import java.util.Collections; import java.util.List;import android.os.Handler; import android.preference.Preference.OnPreferenceChangeInternalListener; import android.view.View; import android.view.ViewGroup; import android.widget.Adapter; import android.widget.BaseAdapter; import android.widget.ListView;/*** An adapter that returns the {@link Preference} contained in this group.* In most cases, this adapter should be the base class for any custom* adapters from {@link Preference#getAdapter()}.* <p>* This adapter obeys the* {@link Preference}'s adapter rule (the* {@link Adapter#getView(int, View, ViewGroup)} should be used instead of* {@link Preference#getView(ViewGroup)} if a {@link Preference} has an* adapter via {@link Preference#getAdapter()}).* <p>* This adapter also propagates data change/invalidated notifications upward.* <p>* This adapter does not include this {@link PreferenceGroup} in the returned* adapter, use {@link PreferenceCategoryAdapter} instead.* * @see PreferenceCategoryAdapter*/ class PreferenceGroupAdapter extends BaseAdapter implements OnPreferenceChangeInternalListener {private static final String TAG = "PreferenceGroupAdapter";/*** The group that we are providing data from.*/private PreferenceGroup mPreferenceGroup;/*** Maps a position into this adapter -> {@link Preference}. These* {@link Preference}s don't have to be direct children of this* {@link PreferenceGroup}, they can be grand children or younger)*/private List<Preference> mPreferenceList;/*** List of unique Preference and its subclasses' names. This is used to find* out how many types of views this adapter can return. Once the count is* returned, this cannot be modified (since the ListView only checks the* count once--when the adapter is being set). We will not recycle views for* Preference subclasses seen after the count has been returned.*/private ArrayList<PreferenceLayout> mPreferenceLayouts;private PreferenceLayout mTempPreferenceLayout = new PreferenceLayout();/*** Blocks the mPreferenceClassNames from being changed anymore.*/private boolean mHasReturnedViewTypeCount = false;private volatile boolean mIsSyncing = false;private Handler mHandler = new Handler(); //start by liweiping 20130826private ArrayList<Integer> mPreferenceListBackgroundIndex;private final int SINGLE_LINE_ROUND_CORNER_BACKGROUND = 1;private final int TOP_ROUND_CORNER_BACKGROUND = 2;private final int BOTTOM_ROUND_CORNER_BACKGROUND = 3;private final int CENTER_RECTANGLE_BACKGROUND = 4;private final int NO_BACKGOUND = 5;//end by liweiping 20130826private Runnable mSyncRunnable = new Runnable() {public void run() {syncMyPreferences();}};private static class PreferenceLayout implements Comparable<PreferenceLayout> {private int resId;private int widgetResId;private String name;public int compareTo(PreferenceLayout other) {int compareNames = name.compareTo(other.name);if (compareNames == 0) {if (resId == other.resId) {if (widgetResId == other.widgetResId) {return 0;} else {return widgetResId - other.widgetResId;}} else {return resId - other.resId;}} else {return compareNames;}}}public PreferenceGroupAdapter(PreferenceGroup preferenceGroup) {mPreferenceGroup = preferenceGroup;// If this group gets or loses any children, let us knowmPreferenceGroup.setOnPreferenceChangeInternalListener(this);mPreferenceList = new ArrayList<Preference>();mPreferenceLayouts = new ArrayList<PreferenceLayout>();syncMyPreferences();}private void syncMyPreferences() {synchronized(this) {if (mIsSyncing) {return;}mIsSyncing = true;}List<Preference> newPreferenceList = new ArrayList<Preference>(mPreferenceList.size());mPreferenceListBackgroundIndex = new ArrayList<Integer>(mPreferenceList.size());//add by liweiping 20130826flattenPreferenceGroup(newPreferenceList, mPreferenceGroup);mPreferenceList = newPreferenceList;notifyDataSetChanged();synchronized(this) {mIsSyncing = false;notifyAll();}}private void flattenPreferenceGroup(List<Preference> preferences, PreferenceGroup group) {// TODO: shouldn't always?group.sortPreferences();final int groupSize = group.getPreferenceCount();final int[] tempIndexOfPrefrence = calcItemsBetweenCategory(group);//add by liweiping 20130826for (int i = 0; i < groupSize; i++) {final Preference preference = group.getPreference(i);preferences.add(preference);//start by liweiping 20130826 if(tempIndexOfPrefrence[i] == 0){mPreferenceListBackgroundIndex.add(NO_BACKGOUND);} else if (tempIndexOfPrefrence[i] == 1&& (i == 0 ? true : tempIndexOfPrefrence[i - 1] <= 1)){if(i == (groupSize - 1) ? true : tempIndexOfPrefrence[i + 1] <= 1){mPreferenceListBackgroundIndex.add(SINGLE_LINE_ROUND_CORNER_BACKGROUND);}else {mPreferenceListBackgroundIndex.add(TOP_ROUND_CORNER_BACKGROUND);}}else if(tempIndexOfPrefrence[i] > 1){if(i == (groupSize - 1) ? true : tempIndexOfPrefrence[i + 1] <= 1){mPreferenceListBackgroundIndex.add(BOTTOM_ROUND_CORNER_BACKGROUND);}else {mPreferenceListBackgroundIndex.add(CENTER_RECTANGLE_BACKGROUND);}}//end by liweiping 20130826if (!mHasReturnedViewTypeCount && !preference.hasSpecifiedLayout()) {addPreferenceClassName(preference);}if (preference instanceof PreferenceGroup) {final PreferenceGroup preferenceAsGroup = (PreferenceGroup) preference;if (preferenceAsGroup.isOnSameScreenAsChildren()) {flattenPreferenceGroup(preferences, preferenceAsGroup);}}preference.setOnPreferenceChangeInternalListener(this);}}/*** Creates a string that includes the preference name, layout id and widget layout id.* If a particular preference type uses 2 different resources, they will be treated as* different view types.*/private PreferenceLayout createPreferenceLayout(Preference preference, PreferenceLayout in) {PreferenceLayout pl = in != null? in : new PreferenceLayout();pl.name = preference.getClass().getName();pl.resId = preference.getLayoutResource();pl.widgetResId = preference.getWidgetLayoutResource();return pl;}private void addPreferenceClassName(Preference preference) {final PreferenceLayout pl = createPreferenceLayout(preference, null);int insertPos = Collections.binarySearch(mPreferenceLayouts, pl);// Only insert if it doesn't exist (when it is negative).if (insertPos < 0) {// Convert to insert indexinsertPos = insertPos * -1 - 1;mPreferenceLayouts.add(insertPos, pl);}}public int getCount() {return mPreferenceList.size();}public Preference getItem(int position) {if (position < 0 || position >= getCount()) return null;return mPreferenceList.get(position);}public long getItemId(int position) {if (position < 0 || position >= getCount()) return ListView.INVALID_ROW_ID;return this.getItem(position).getId();}public View getView(int position, View convertView, ViewGroup parent) {final Preference preference = this.getItem(position);// Build a PreferenceLayout to compare with known ones that are cacheable.mTempPreferenceLayout = createPreferenceLayout(preference, mTempPreferenceLayout);// If it's not one of the cached ones, set the convertView to null so that // the layout gets re-created by the Preference.if (Collections.binarySearch(mPreferenceLayouts, mTempPreferenceLayout) < 0) {convertView = null;}// start by liweiping 20130826 //return preference.getView(convertView, parent);View mView = preference.getView(convertView, parent);mView.setBackgroundResource(com.android.internal.R.color.transparent);if(mPreferenceListBackgroundIndex.get(position) == SINGLE_LINE_ROUND_CORNER_BACKGROUND){mView.setBackgroundResource(com.android.internal.R.drawable.easy_pref_item_single);}else if(mPreferenceListBackgroundIndex.get(position) == TOP_ROUND_CORNER_BACKGROUND){mView.setBackgroundResource(com.android.internal.R.drawable.easy_pref_item_top);}else if(mPreferenceListBackgroundIndex.get(position) == CENTER_RECTANGLE_BACKGROUND){mView.setBackgroundResource(com.android.internal.R.drawable.easy_pref_item_center);}else if(mPreferenceListBackgroundIndex.get(position) == BOTTOM_ROUND_CORNER_BACKGROUND){mView.setBackgroundResource(com.android.internal.R.drawable.easy_pref_item_bottom);}return mView;//end by liweiping 20130826}@Overridepublic boolean isEnabled(int position) {if (position < 0 || position >= getCount()) return true;return this.getItem(position).isSelectable();}@Overridepublic boolean areAllItemsEnabled() {// There should always be a preference group, and these groups are always// disabledreturn false;}public void onPreferenceChange(Preference preference) {notifyDataSetChanged();}public void onPreferenceHierarchyChange(Preference preference) {mHandler.removeCallbacks(mSyncRunnable);mHandler.post(mSyncRunnable);}@Overridepublic boolean hasStableIds() {return true;}@Overridepublic int getItemViewType(int position) {if (!mHasReturnedViewTypeCount) {mHasReturnedViewTypeCount = true;}final Preference preference = this.getItem(position);if (preference.hasSpecifiedLayout()) {return IGNORE_ITEM_VIEW_TYPE;}mTempPreferenceLayout = createPreferenceLayout(preference, mTempPreferenceLayout);int viewType = Collections.binarySearch(mPreferenceLayouts, mTempPreferenceLayout);if (viewType < 0) {// This is a class that was seen after we returned the count, so// don't recycle it.return IGNORE_ITEM_VIEW_TYPE;} else {return viewType;}}@Overridepublic int getViewTypeCount() {if (!mHasReturnedViewTypeCount) {mHasReturnedViewTypeCount = true;}return Math.max(1, mPreferenceLayouts.size());}//start by liweiping 20130826private int[] calcItemsBetweenCategory(PreferenceGroup group){final int groupSize = group.getPreferenceCount();int[] indexOfPreference = new int[groupSize];for (int i = 0; i < groupSize; i++) {final Preference preference = group.getPreference(i);if (preference instanceof PreferenceCategory) {indexOfPreference[i] = 0 ;}else if(i == 0){indexOfPreference[i] = 1 ;}else {indexOfPreference[i] = indexOfPreference[i - 1] + 1;}}return indexOfPreference;}//end by liweiping 20130826 }

  • tab風格的實現

tab風格的實現有兩種方法,一種是傳統的TabHost,另外一種就是從3.0開始的ActionBar中的tab,我最開始使用的就是TabHost,也大概實現了,但是最后的Bug讓我頭疼死了,因此果斷放棄,選擇了ActionBar的tab,其實一開始就應該選擇這個的,由于筆者過度自信對TabHost的使用熟練度,因此結果就是不得不返工,浪費時間精力。其實用ActionBar的tab對代碼的改動應該是最小的。下面來看看我修改過后的Settings.java的源碼(我的修改也是打過liweiping標簽的):

/** Copyright (C) 2008 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package com.android.settings;import com.android.settings.accounts.AccountSyncSettings; import com.android.settings.bluetooth.BluetoothEnabler; import com.android.settings.fuelgauge.PowerUsageSummary; import com.android.settings.wifi.WifiEnabler; //import static com.sprd.android.config.OptConfig.LC_RAM_SUPPORT;import android.app.ActionBar; import android.app.ActionBar.Tab; import android.app.ActionBar.TabListener; import android.app.FragmentTransaction; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; import android.os.SystemProperties; import android.os.TopwiseProp; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.MenuItem; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.Switch; import android.widget.TextView;import java.util.ArrayList; import java.util.HashMap; import java.util.List;/*** Top-level settings activity to handle single pane and double pane UI layout.*/ public class Settings extends PreferenceActivity implements ButtonBarHandler {private static final String LOG_TAG = "Settings";private static final String META_DATA_KEY_HEADER_ID ="com.android.settings.TOP_LEVEL_HEADER_ID";private static final String META_DATA_KEY_FRAGMENT_CLASS ="com.android.settings.FRAGMENT_CLASS";private static final String META_DATA_KEY_PARENT_TITLE ="com.android.settings.PARENT_FRAGMENT_TITLE";private static final String META_DATA_KEY_PARENT_FRAGMENT_CLASS ="com.android.settings.PARENT_FRAGMENT_CLASS";private static final String EXTRA_CLEAR_UI_OPTIONS = "settings:remove_ui_options";private static final String SAVE_KEY_CURRENT_HEADER = "com.android.settings.CURRENT_HEADER";private static final String SAVE_KEY_PARENT_HEADER = "com.android.settings.PARENT_HEADER";public static boolean UNIVERSEUI_SUPPORT = SystemProperties.getBoolean("universe_ui_support",false);private String mFragmentClass;private int mTopLevelHeaderId;private Header mFirstHeader;private Header mCurrentHeader;private Header mParentHeader;private boolean mInLocalHeaderSwitch;// TODO: Update Call Settings based on airplane mode state.protected HashMap<Integer, Integer> mHeaderIndexMap = new HashMap<Integer, Integer>();private List<Header> mHeaders;//start by liweiping 20140103private int mTabFlag;private static final int FLAG_TAB_WIRELESS_NETWORKS = 0;private static final int FLAG_TAB_DEVICE = 1;private static final int FLAG_TAB_PERSONAL = 2;private static final int FLAG_TAB_SYSTEM = 3;private final TabListener mTabListener = new TabListener() {@Overridepublic void onTabUnselected(Tab tab, FragmentTransaction ft) {// TODO Auto-generated method stub}@Overridepublic void onTabSelected(Tab tab, FragmentTransaction ft) {//Log.i("lwp-log", "tab.getContentDescription().toString() = "+tab.getContentDescription().toString());if (tab.getContentDescription().toString().equals(getResources().getString(R.string.header_category_wireless_networks))){mTabFlag = FLAG_TAB_WIRELESS_NETWORKS;}else if(tab.getContentDescription().toString().equals(getResources().getString(R.string.header_category_personal))) {mTabFlag = FLAG_TAB_PERSONAL;} else if (tab.getContentDescription().toString().equals(getResources().getString(R.string.header_category_system))) {mTabFlag = FLAG_TAB_SYSTEM;} else if (tab.getContentDescription().toString().equals(getResources().getString(R.string.header_category_device))) {mTabFlag = FLAG_TAB_DEVICE;}Log.i("lwp-log", "onTabSelected mTabFlag = " + mTabFlag); invalidateHeaders();}@Overridepublic void onTabReselected(Tab tab, FragmentTransaction ft) {}};private void setupWirelessNetworks(ActionBar bar) {final Tab tab = bar.newTab();View view = mInflater.inflate(R.layout.tab_widget_view, null);ImageView dialView = (ImageView)view.findViewById(R.id.main_activity_tab_image);if(dialView != null){dialView.setImageResource(R.drawable.ic_tab_wireless);}TextView dialText = (TextView) view.findViewById(R.id.main_activity_tab_text);if(dialText!=null){dialText.setText(R.string.header_category_wireless_networks);}tab.setCustomView(view);tab.setTabListener(mTabListener);tab.setContentDescription(R.string.header_category_wireless_networks);bar.addTab(tab);}private void setupDevice(ActionBar bar) {final Tab tab = bar.newTab();View view = mInflater.inflate(R.layout.tab_widget_view, null);ImageView dialView = (ImageView)view.findViewById(R.id.main_activity_tab_image);if(dialView != null){dialView.setImageResource(R.drawable.ic_tab_device);}TextView dialText = (TextView) view.findViewById(R.id.main_activity_tab_text);if(dialText!=null){dialText.setText(R.string.header_category_device);}tab.setCustomView(view);tab.setTabListener(mTabListener);tab.setContentDescription(R.string.header_category_device);bar.addTab(tab);}private void setupPersonal(ActionBar bar) {final Tab tab = bar.newTab();View view = mInflater.inflate(R.layout.tab_widget_view, null);ImageView dialView = (ImageView)view.findViewById(R.id.main_activity_tab_image);if(dialView != null){dialView.setImageResource(R.drawable.ic_tab_personal);}TextView dialText = (TextView) view.findViewById(R.id.main_activity_tab_text);if(dialText!=null){dialText.setText(R.string.header_category_personal);}tab.setCustomView(view);tab.setTabListener(mTabListener);tab.setContentDescription(R.string.header_category_personal);bar.addTab(tab);}private void setupSystem(ActionBar bar) {final Tab tab = bar.newTab();View view = mInflater.inflate(R.layout.tab_widget_view, null);ImageView dialView = (ImageView)view.findViewById(R.id.main_activity_tab_image);if(dialView != null){dialView.setImageResource(R.drawable.ic_tab_system);}TextView dialText = (TextView) view.findViewById(R.id.main_activity_tab_text);if(dialText!=null){dialText.setText(R.string.header_category_system);}tab.setCustomView(view);tab.setTabListener(mTabListener);tab.setContentDescription(R.string.header_category_system);bar.addTab(tab);}private LayoutInflater mInflater;//end by liweiping 20140103@Overrideprotected void onCreate(Bundle savedInstanceState) {if(UNIVERSEUI_SUPPORT){this.setTheme(R.style.Theme_Holo_new_ui);}if (getIntent().getBooleanExtra(EXTRA_CLEAR_UI_OPTIONS, false)) {getWindow().setUiOptions(0);}//start by liweiping 20140103setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);mInflater = getLayoutInflater();mTabFlag = FLAG_TAB_WIRELESS_NETWORKS;//end by liweiping 20140103getMetaData();mInLocalHeaderSwitch = true;super.onCreate(savedInstanceState);mInLocalHeaderSwitch = false;//For LowCost case, define the list selector by itself// if (LC_RAM_SUPPORT) {//ListView list = getListView();//list.setSelector(R.drawable.list_selector_holo_dark);// list.setOverScrollMode(View.OVER_SCROLL_NEVER);// }if (!onIsHidingHeaders() && onIsMultiPane()) {highlightHeader();// Force the title so that it doesn't get overridden by a direct launch of// a specific settings screen.setTitle(R.string.settings_label);}// Retrieve any saved stateif (savedInstanceState != null) {mCurrentHeader = savedInstanceState.getParcelable(SAVE_KEY_CURRENT_HEADER);mParentHeader = savedInstanceState.getParcelable(SAVE_KEY_PARENT_HEADER);}// If the current header was saved, switch to itif (savedInstanceState != null && mCurrentHeader != null) {//switchToHeaderLocal(mCurrentHeader);showBreadCrumbs(mCurrentHeader.title, null);}if (mParentHeader != null) {setParentTitle(mParentHeader.title, null, new OnClickListener() {public void onClick(View v) {switchToParent(mParentHeader.fragment);}});}}/* Set ActionBar with popup function */protected void setActionBarStyle() {ActionBar actionBar = getActionBar();if (actionBar == null){return;}//start by liweiping 20140106Log.i("lwp-log", "this.toString() = " + this.toString());//if ( this.toString().contains("SubSettings") ) {if ( this.toString().contains("SubSettings") || this.toString().contains("$")) {//end by liweiping 20140106actionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_HOME_AS_UP);actionBar.setDisplayHomeAsUpEnabled(true);}else {actionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP^ ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_HOME_AS_UP);actionBar.setDisplayHomeAsUpEnabled(false);//start by liweiping 20140103actionBar.setAlternativeTabStyle(true);actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);if(actionBar.getTabCount() == 0){setupWirelessNetworks(actionBar);setupDevice(actionBar);setupPersonal(actionBar);setupSystem(actionBar);}final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);mTabFlag = settings.getInt("tab", FLAG_TAB_WIRELESS_NETWORKS);Log.i("lwp-log", "setActionBarStyle mTabFlag = " + mTabFlag);actionBar.selectTab(actionBar.getTabAt(mTabFlag));//end by liweiping 20140103}}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// TODO Add support for android.R.id.home in all Setting's onOptionsItemSelected// getActionBar().setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP,// ActionBar.DISPLAY_HOME_AS_UP);// Now it's done.if (item.getItemId() == android.R.id.home) {finish();return true;}return super.onOptionsItemSelected(item);}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);// Save the current fragment, if it is the same as originally launchedif (mCurrentHeader != null) {outState.putParcelable(SAVE_KEY_CURRENT_HEADER, mCurrentHeader);}if (mParentHeader != null) {outState.putParcelable(SAVE_KEY_PARENT_HEADER, mParentHeader);}}@Overridepublic void onResume() {ListAdapter listAdapter = getListAdapter();if (listAdapter instanceof HeaderAdapter) {((HeaderAdapter) listAdapter).resume();}setActionBarStyle();super.onResume();}@Overridepublic void onPause() {super.onPause();ListAdapter listAdapter = getListAdapter();if (listAdapter instanceof HeaderAdapter) {((HeaderAdapter) listAdapter).pause();}//start by liweiping 20140106final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);settings.edit().putInt("tab", settings.getInt("tab", FLAG_TAB_WIRELESS_NETWORKS)).commit();//end by liweiping 20140106 }//start by liweiping 20140106@Overrideprotected void onDestroy() {super.onDestroy();//final SharedPreferences settings = PreferenceManager// .getDefaultSharedPreferences(this);//settings.edit().putInt("tab", FLAG_TAB_WIRELESS_NETWORKS).commit();}//end by liweiping 20140106 @Overridepublic void onBackPressed() {if (!moveTaskToBack(false)) {super.onBackPressed();}}private void switchToHeaderLocal(Header header) {mInLocalHeaderSwitch = true;switchToHeader(header);mInLocalHeaderSwitch = false;}@Overridepublic void switchToHeader(Header header) {if (!mInLocalHeaderSwitch) {mCurrentHeader = null;mParentHeader = null;}super.switchToHeader(header);}/*** Switch to parent fragment and store the grand parent's info* @param className name of the activity wrapper for the parent fragment.*/private void switchToParent(String className) {final ComponentName cn = new ComponentName(this, className);try {final PackageManager pm = getPackageManager();final ActivityInfo parentInfo = pm.getActivityInfo(cn, PackageManager.GET_META_DATA);if (parentInfo != null && parentInfo.metaData != null) {String fragmentClass = parentInfo.metaData.getString(META_DATA_KEY_FRAGMENT_CLASS);CharSequence fragmentTitle = parentInfo.loadLabel(pm);Header parentHeader = new Header();parentHeader.fragment = fragmentClass;parentHeader.title = fragmentTitle;mCurrentHeader = parentHeader;switchToHeaderLocal(parentHeader);highlightHeader();mParentHeader = new Header();mParentHeader.fragment= parentInfo.metaData.getString(META_DATA_KEY_PARENT_FRAGMENT_CLASS);mParentHeader.title = parentInfo.metaData.getString(META_DATA_KEY_PARENT_TITLE);}} catch (NameNotFoundException nnfe) {Log.w(LOG_TAG, "Could not find parent activity : " + className);}}@Overridepublic void onNewIntent(Intent intent) {super.onNewIntent(intent);// If it is not launched from history, then reset to top-levelif ((intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0&& mFirstHeader != null && !onIsHidingHeaders() && onIsMultiPane()) {switchToHeaderLocal(mFirstHeader);}}private void highlightHeader() {if (mTopLevelHeaderId != 0) {Integer index = mHeaderIndexMap.get(mTopLevelHeaderId);if (index != null) {getListView().setItemChecked(index, true);getListView().smoothScrollToPosition(index);}}}@Overridepublic Intent getIntent() {Intent superIntent = super.getIntent();String startingFragment = getStartingFragmentClass(superIntent);// This is called from super.onCreate, isMultiPane() is not yet reliable// Do not use onIsHidingHeaders either, which relies itself on this methodif (startingFragment != null && !onIsMultiPane()) {Intent modIntent = new Intent(superIntent);modIntent.putExtra(EXTRA_SHOW_FRAGMENT, startingFragment);Bundle args = superIntent.getExtras();if (args != null) {args = new Bundle(args);} else {args = new Bundle();}args.putParcelable("intent", superIntent);modIntent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, superIntent.getExtras());return modIntent;}return superIntent;}/*** Checks if the component name in the intent is different from the Settings class and* returns the class name to load as a fragment.*/protected String getStartingFragmentClass(Intent intent) {if (mFragmentClass != null) return mFragmentClass;String intentClass = intent.getComponent().getClassName();if (intentClass.equals(getClass().getName())) return null;if ("com.android.settings.ManageApplications".equals(intentClass)|| "com.android.settings.RunningServices".equals(intentClass)|| "com.android.settings.applications.StorageUse".equals(intentClass)) {// Old names of manage apps.intentClass = com.android.settings.applications.ManageApplications.class.getName();}return intentClass;}/*** Override initial header when an activity-alias is causing Settings to be launched* for a specific fragment encoded in the android:name parameter.*/@Overridepublic Header onGetInitialHeader() {String fragmentClass = getStartingFragmentClass(super.getIntent());if (fragmentClass != null) {Header header = new Header();header.fragment = fragmentClass;header.title = getTitle();header.fragmentArguments = getIntent().getExtras();mCurrentHeader = header;return header;}return mFirstHeader;}@Overridepublic Intent onBuildStartFragmentIntent(String fragmentName, Bundle args,int titleRes, int shortTitleRes) {Intent intent = super.onBuildStartFragmentIntent(fragmentName, args,titleRes, shortTitleRes);// some fragments want to avoid split actionbarif (DataUsageSummary.class.getName().equals(fragmentName) ||PowerUsageSummary.class.getName().equals(fragmentName) ||AccountSyncSettings.class.getName().equals(fragmentName) ||UserDictionarySettings.class.getName().equals(fragmentName)) {intent.putExtra(EXTRA_CLEAR_UI_OPTIONS, true);}intent.setClass(this, SubSettings.class);return intent;}/*** Populate the activity with the top-level headers.*/@Overridepublic void onBuildHeaders(List<Header> headers) {//start by liweiping 20130103//if(UNIVERSEUI_SUPPORT){// loadHeadersFromResource(R.xml.settings_headers_uui, headers);//}else{// loadHeadersFromResource(R.xml.settings_headers, headers);//}Log.i("lwp", "mTabFlag = "+mTabFlag + ", headers.size() = "+ headers.size() );if (mTabFlag == FLAG_TAB_WIRELESS_NETWORKS){loadHeadersFromResource(R.xml.settings_headers_wireless_networks, headers);}else if(mTabFlag == FLAG_TAB_DEVICE){loadHeadersFromResource(R.xml.settings_headers_device, headers);}else if(mTabFlag == FLAG_TAB_PERSONAL){loadHeadersFromResource(R.xml.settings_headers_personal, headers);}else{loadHeadersFromResource(R.xml.settings_headers_system, headers);}//end by liweiping 20130103updateHeaderList(headers);//start by liweiping 20130107 for bug 1146//mHeaders = headers;if(mHeaders != null){mHeaders.clear();mHeaders.addAll(headers);}//end by liweiping 20130107}private void updateHeaderList(List<Header> target) {int i = 0;while (i < target.size()) {Header header = target.get(i);// Ids are integers, so downcastingint id = (int) header.id;if (id == R.id.dock_settings) {if (!needsDockSettings())target.remove(header);} else if (id == R.id.operator_settings || id == R.id.manufacturer_settings) {Utils.updateHeaderToSpecificActivityFromMetaDataOrRemove(this, target, header);} else if (id == R.id.wifi_settings) {// Remove WiFi Settings if WiFi service is not available.// modified by zhangguixin// if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI)) {if (!SystemProperties.getBoolean("ro.device.support.wifi", true)) {// if ("0".equals(SystemProperties.getBoolean("ro.device.support.wifi", "1"))) {target.remove(header);}} else if (id == R.id.bluetooth_settings) {// Remove Bluetooth Settings if Bluetooth service is not available.// modified by zhangguixin// if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)) {if (!SystemProperties.getBoolean("ro.device.support.bt", true)) {// if ("0".equals(SystemProperties.getBoolean("ro.device.support.bt", "1"))) {target.remove(header);}} else if (id == R.id.dual_sim_settings) {if (!TelephonyManager.isMultiSim()) {target.remove(header);}} else if (id == R.id.data_usage_settings &&"sc8825".equalsIgnoreCase(SystemProperties.get("ro.board.platform", "sc8825"))) {//fix bug182500target.remove(header);}//add by huangweiwei, topwise, 2013-10-12else if (id == R.id.development_settings) {if (android.os.TopwiseProp.getDefaultSettingBoolean("settings_remove_development", false)) {target.remove(header);}}//add end by huangweiwei, topwise, 2013-10-12// Increment if the current one wasn't removed by the Utils code.if (target.get(i) == header) {// Hold on to the first header, when we need to reset to the top-levelif (mFirstHeader == null &&HeaderAdapter.getHeaderType(header) != HeaderAdapter.HEADER_TYPE_CATEGORY) {mFirstHeader = header;}mHeaderIndexMap.put(id, i);i++;}}}private boolean needsDockSettings() {return getResources().getBoolean(R.bool.has_dock_settings);}private void getMetaData() {try {ActivityInfo ai = getPackageManager().getActivityInfo(getComponentName(),PackageManager.GET_META_DATA);if (ai == null || ai.metaData == null) return;mTopLevelHeaderId = ai.metaData.getInt(META_DATA_KEY_HEADER_ID);mFragmentClass = ai.metaData.getString(META_DATA_KEY_FRAGMENT_CLASS);// Check if it has a parent specified and create a Header objectfinal int parentHeaderTitleRes = ai.metaData.getInt(META_DATA_KEY_PARENT_TITLE);String parentFragmentClass = ai.metaData.getString(META_DATA_KEY_PARENT_FRAGMENT_CLASS);if (parentFragmentClass != null) {mParentHeader = new Header();mParentHeader.fragment = parentFragmentClass;if (parentHeaderTitleRes != 0) {mParentHeader.title = getResources().getString(parentHeaderTitleRes);}}} catch (NameNotFoundException nnfe) {// No recovery}}@Overridepublic boolean hasNextButton() {return super.hasNextButton();}@Overridepublic Button getNextButton() {return super.getNextButton();}private static class HeaderAdapter extends ArrayAdapter<Header> {static final int HEADER_TYPE_CATEGORY = 0;static final int HEADER_TYPE_NORMAL = 1;static final int HEADER_TYPE_SWITCH = 2;private static final int HEADER_TYPE_COUNT = HEADER_TYPE_SWITCH + 1;private final WifiEnabler mWifiEnabler;private final BluetoothEnabler mBluetoothEnabler;private SparseArray<View> mViewCache;private static class HeaderViewHolder {ImageView icon;TextView title;TextView summary;Switch switch_;}private LayoutInflater mInflater;static int getHeaderType(Header header) {if (header.fragment == null && header.intent == null) {return HEADER_TYPE_CATEGORY;} else if (header.id == R.id.wifi_settings || header.id == R.id.bluetooth_settings) {return HEADER_TYPE_SWITCH;} else {return HEADER_TYPE_NORMAL;}}@Overridepublic int getItemViewType(int position) {Header header = getItem(position);return getHeaderType(header);}//start by liweiping 20140106@Overridepublic void notifyDataSetChanged() {// TODO Auto-generated method stubsuper.notifyDataSetChanged();mViewCache = new SparseArray<View>(getCount());}//end by liweiping 20140106@Overridepublic boolean areAllItemsEnabled() {return false; // because of categories}@Overridepublic boolean isEnabled(int position) {return getItemViewType(position) != HEADER_TYPE_CATEGORY;}@Overridepublic int getViewTypeCount() {return HEADER_TYPE_COUNT;}@Overridepublic boolean hasStableIds() {return true;}public HeaderAdapter(Context context, List<Header> objects) {super(context, 0, objects);mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);// Temp Switches provided as placeholder until the adapter replaces these with actual// Switches inflated from their layouts. Must be done before adapter is set in supermWifiEnabler = new WifiEnabler(context, new Switch(context));mBluetoothEnabler = new BluetoothEnabler(context, new Switch(context));mViewCache = new SparseArray<View>(objects.size());}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {HeaderViewHolder holder;Header header = getItem(position);int headerType = getHeaderType(header);View view = null;convertView = mViewCache.get(position);if (convertView == null) {holder = new HeaderViewHolder();switch (headerType) {case HEADER_TYPE_CATEGORY:view = new TextView(getContext(), null,android.R.attr.listSeparatorTextViewStyle);holder.title = (TextView) view;break;case HEADER_TYPE_SWITCH:view = mInflater.inflate(R.layout.preference_header_switch_item, parent,false);holder.icon = (ImageView) view.findViewById(R.id.icon);holder.title = (TextView)view.findViewById(com.android.internal.R.id.title);holder.summary = (TextView)view.findViewById(com.android.internal.R.id.summary);holder.switch_ = (Switch) view.findViewById(R.id.switchWidget);break;case HEADER_TYPE_NORMAL:view = mInflater.inflate(com.android.internal.R.layout.preference_header_item, parent,false);holder.icon = (ImageView) view.findViewById(com.android.internal.R.id.icon);holder.title = (TextView)view.findViewById(com.android.internal.R.id.title);holder.summary = (TextView)view.findViewById(com.android.internal.R.id.summary);break;}view.setBackgroundDrawable(null);view.setTag(holder);mViewCache.put(position, view);} else {view = convertView;holder = (HeaderViewHolder) view.getTag();return view;}// All view fields must be updated every time, because the view may be recycledswitch (headerType) {case HEADER_TYPE_CATEGORY:holder.title.setText(header.getTitle(getContext().getResources()));holder.title.setTextColor(android.R.color.transparent);//add by liweiping 20130826break;case HEADER_TYPE_SWITCH:// Would need a different treatment if the main menu had more switchesif (header.id == R.id.wifi_settings) {mWifiEnabler.setSwitch(holder.switch_);} else {mBluetoothEnabler.setSwitch(holder.switch_);}// No break, fall through on purpose to update common fields//$FALL-THROUGH$case HEADER_TYPE_NORMAL:holder.icon.setImageResource(header.iconRes);holder.title.setText(header.getTitle(getContext().getResources()));CharSequence summary = header.getSummary(getContext().getResources());if (!TextUtils.isEmpty(summary)) {holder.summary.setVisibility(View.VISIBLE);holder.summary.setText(summary);} else {holder.summary.setVisibility(View.GONE);}break;}//start by liweiping 20130826if (header.fragment == null && header.intent == null) {view.setBackgroundColor(android.R.color.transparent); }else if(header.id == R.id.dual_sim_settings || header.id == R.id.sound_settings || header.id == R.id.sync_settings || header.id == R.id.dock_settings || header.id == R.id.date_time_settings){view.setBackgroundResource(com.android.internal.R.drawable.easy_pref_item_top);}else if(header.id == R.id.wireless_settings || header.id == R.id.manufacturer_settings || header.id == R.id.privacy_settings || header.id == R.id.about_settings || header.id == R.id.application_settings){view.setBackgroundResource(com.android.internal.R.drawable.easy_pref_item_bottom);}else {view.setBackgroundResource(com.android.internal.R.drawable.easy_pref_item_center);}//end by liweiping 20130826return view;}public void resume() {mWifiEnabler.resume();mBluetoothEnabler.resume();}public void pause() {mWifiEnabler.pause();mBluetoothEnabler.pause();}}@Overridepublic boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) {// Override the fragment title for Wallpaper settingsint titleRes = pref.getTitleRes();if (pref.getFragment().equals(WallpaperTypeSettings.class.getName())) {titleRes = R.string.wallpaper_settings_fragment_title;}startPreferencePanel(pref.getFragment(), pref.getExtras(), titleRes, null, null, 0);return true;}//start,added by topwise hehuadong in 2013.10.24@Overridepublic void onHeaderClick(Header header, int position) {// TODO Auto-generated method stub//start by liweiping 20140105final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);settings.edit().putInt("tab", mTabFlag).commit();Log.i("lwp-log", "onHeaderClick..." + settings.getInt("tab", -1));//end by liweiping 20140105if (TopwiseProp.getDefaultSettingString("default_customize_about_device")!=null){if (header != null && header.fragment !=null && header.fragment.equals("com.android.settings.DeviceInfoSettings")){header.fragment="com.android.settings.AboutDeviceSettings";}}super.onHeaderClick(header, position);}//end,added by topwise hehuadong in 2013.10.24@Overridepublic void setListAdapter(ListAdapter adapter) {if (mHeaders == null) {mHeaders = new ArrayList<Header>();// When the saved state provides the list of headers, onBuildHeaders is not called// Copy the list of Headers from the adapter, preserving their orderfor (int i = 0; i < adapter.getCount(); i++) {mHeaders.add((Header) adapter.getItem(i));}}// Ignore the adapter provided by PreferenceActivity and substitute ours insteadsuper.setListAdapter(new HeaderAdapter(this, mHeaders));}/** Settings subclasses for launching independently.*/public static class BluetoothSettingsActivity extends Settings { /* empty */ }public static class WirelessSettingsActivity extends Settings { /* empty */ }public static class TetherSettingsActivity extends Settings { /* empty */ }public static class VpnSettingsActivity extends Settings { /* empty */ }public static class DateTimeSettingsActivity extends Settings { /* empty */ }public static class StorageSettingsActivity extends Settings { /* empty */ }public static class WifiSettingsActivity extends Settings { /* empty */ }public static class WifiP2pSettingsActivity extends Settings { /* empty */ }public static class InputMethodAndLanguageSettingsActivity extends Settings { /* empty */ }public static class InputMethodAndSubtypeEnablerActivity extends Settings { /* empty */ }public static class SpellCheckersSettingsActivity extends Settings { /* empty */ }public static class LocalePickerActivity extends Settings { /* empty */ }public static class UserDictionarySettingsActivity extends Settings { /* empty */ }public static class SoundSettingsActivity extends Settings { /* empty */ }public static class DisplaySettingsActivity extends Settings { /* empty */ }public static class DeviceInfoSettingsActivity extends Settings { /* empty */ }public static class ApplicationSettingsActivity extends Settings { /* empty */ }public static class ManageApplicationsActivity extends Settings { /* empty */ }public static class StorageUseActivity extends Settings { /* empty */ }public static class DevelopmentSettingsActivity extends Settings { /* empty */ }public static class AccessibilitySettingsActivity extends Settings { /* empty */ }public static class SecuritySettingsActivity extends Settings { /* empty */ }public static class LocationSettingsActivity extends Settings { /* empty */ }public static class PrivacySettingsActivity extends Settings { /* empty */ }public static class DockSettingsActivity extends Settings { /* empty */ }public static class RunningServicesActivity extends Settings { /* empty */ }public static class ManageAccountsSettingsActivity extends Settings { /* empty */ }public static class PowerUsageSummaryActivity extends Settings { /* empty */ }public static class AccountSyncSettingsActivity extends Settings { /* empty */ }public static class AccountSyncSettingsInAddAccountActivity extends Settings { /* empty */ }public static class CryptKeeperSettingsActivity extends Settings { /* empty */ }public static class DeviceAdminSettingsActivity extends Settings { /* empty */ }public static class DataUsageSummaryActivity extends Settings { /* empty */ }public static class AdvancedWifiSettingsActivity extends Settings { /* empty */ }public static class TextToSpeechSettingsActivity extends Settings { /* empty */ }public static class AndroidBeamSettingsActivity extends Settings { /* empty */ } }
簡單分析一下:

①.首先我們在onResume中找到setActionBarStyle這個函數,這就是設置每次恢復時的必經之路,在這里,我們改變ActionBar的樣式,如果是一級界面,就加上tab風格,二級界面就去掉tab風格,顯示返回鍵。

/* Set ActionBar with popup function */protected void setActionBarStyle() {ActionBar actionBar = getActionBar();if (actionBar == null){return;}//start by liweiping 20140106Log.i("lwp-log", "this.toString() = " + this.toString());//if ( this.toString().contains("SubSettings") ) {if ( this.toString().contains("SubSettings") || this.toString().contains("$")) {//end by liweiping 20140106actionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_HOME_AS_UP);actionBar.setDisplayHomeAsUpEnabled(true);}else {actionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP^ ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_HOME_AS_UP);actionBar.setDisplayHomeAsUpEnabled(false);//start by liweiping 20140103actionBar.setAlternativeTabStyle(true);actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);if(actionBar.getTabCount() == 0){setupWirelessNetworks(actionBar);setupDevice(actionBar);setupPersonal(actionBar);setupSystem(actionBar);}final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);mTabFlag = settings.getInt("tab", FLAG_TAB_WIRELESS_NETWORKS);Log.i("lwp-log", "setActionBarStyle mTabFlag = " + mTabFlag);actionBar.selectTab(actionBar.getTabAt(mTabFlag));//end by liweiping 20140103}}
②.監聽tab的選擇事件,點擊每一個tab產生對應的事件,然后把選擇項存為全局變量mTabFlag中,最后調用invalidateHeaders()函數刷新界面,替換成不同的Header list。

private final TabListener mTabListener = new TabListener() {@Overridepublic void onTabUnselected(Tab tab, FragmentTransaction ft) {// TODO Auto-generated method stub}@Overridepublic void onTabSelected(Tab tab, FragmentTransaction ft) {//Log.i("lwp-log", "tab.getContentDescription().toString() = "+tab.getContentDescription().toString());if (tab.getContentDescription().toString().equals(getResources().getString(R.string.header_category_wireless_networks))){mTabFlag = FLAG_TAB_WIRELESS_NETWORKS;}else if(tab.getContentDescription().toString().equals(getResources().getString(R.string.header_category_personal))) {mTabFlag = FLAG_TAB_PERSONAL;} else if (tab.getContentDescription().toString().equals(getResources().getString(R.string.header_category_system))) {mTabFlag = FLAG_TAB_SYSTEM;} else if (tab.getContentDescription().toString().equals(getResources().getString(R.string.header_category_device))) {mTabFlag = FLAG_TAB_DEVICE;}Log.i("lwp-log", "onTabSelected mTabFlag = " + mTabFlag);invalidateHeaders();}@Overridepublic void onTabReselected(Tab tab, FragmentTransaction ft) {}};
③.當調用invalidateHeaders()函數時,就進入了onBuildHeaders(List<Header> headers)函數,在這里,我們需要根據mTabFlag來loadHeadersFromResource對應的布局文件,最后一定要記住用新的headers將全局變量mHeaders替換掉。

/*** Populate the activity with the top-level headers.*/@Overridepublic void onBuildHeaders(List<Header> headers) {//start by liweiping 20130103//if(UNIVERSEUI_SUPPORT){// loadHeadersFromResource(R.xml.settings_headers_uui, headers);//}else{// loadHeadersFromResource(R.xml.settings_headers, headers);//}Log.i("lwp", "mTabFlag = "+mTabFlag + ", headers.size() = "+ headers.size() );if (mTabFlag == FLAG_TAB_WIRELESS_NETWORKS){loadHeadersFromResource(R.xml.settings_headers_wireless_networks, headers);}else if(mTabFlag == FLAG_TAB_DEVICE){loadHeadersFromResource(R.xml.settings_headers_device, headers);}else if(mTabFlag == FLAG_TAB_PERSONAL){loadHeadersFromResource(R.xml.settings_headers_personal, headers);}else{loadHeadersFromResource(R.xml.settings_headers_system, headers);}//end by liweiping 20130103updateHeaderList(headers);//start by liweiping 20130107 for bug 1146//mHeaders = headers;if(mHeaders != null){mHeaders.clear();mHeaders.addAll(headers);}//end by liweiping 20130107}

OK,今天就大概這樣了。


轉載于:https://my.oschina.net/cjkall/blog/195789

總結

以上是生活随笔為你收集整理的Android4.0设置界面修改总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久久黄色网址 | 国产99久久九九精品免费 | 欧美日韩中文字幕在线视频 | 中文字幕 第二区 | 麻豆视频免费观看 | 久精品在线 | 超碰com| 亚洲精品视频免费观看 | 日韩激情视频 | 中文字幕成人 | 欧美久草视频 | 丁香婷婷激情国产高清秒播 | 精品国产一区二区三区久久久蜜月 | 日韩成人在线一区二区 | 狠狠夜夜 | 在线观看视频你懂的 | 成年人在线视频观看 | 日日躁夜夜躁aaaaxxxx | 成人国产精品免费 | 久久久国产网站 | 97综合视频| 97看片 | 97国产电影 | 日日干天天爽 | 久久精品国产第一区二区三区 | 九九综合九九 | 色www.| 人人舔人人射 | 国产精品一区二区三区99 | 91精品久久香蕉国产线看观看 | 91日韩在线播放 | 国产又粗又猛又爽又黄的视频先 | 午夜精品久久久久久久99水蜜桃 | 久久久国际精品 | 最近免费中文字幕大全高清10 | 国产成人精品av久久 | 亚州免费视频 | 色亚洲激情 | 日av免费| 国产成人三级 | 人人玩人人添人人澡97 | 国产91综合一区在线观看 | 在线免费观看国产 | 久久高清国产视频 | 91网站免费观看 | 六月婷婷久香在线视频 | 久久在线观看 | 日日操日日干 | 国产精品福利在线观看 | 国产999视频 | 视频91| 日韩毛片在线播放 | 区一区二区三区中文字幕 | 偷拍福利视频一区二区三区 | 日韩视频免费 | 国内精品久久久久久久影视麻豆 | 激情五月婷婷综合网 | 日韩精品一区二区三区免费观看 | 欧美性黄网官网 | 国产一区二区三精品久久久无广告 | 青青草在久久免费久久免费 | 日韩综合第一页 | 亚洲国产一区在线观看 | 久久中文网 | av蜜桃在线 | 久久超级碰 | 在线中文字幕电影 | 国产97色在线 | 正在播放国产一区 | 国产精品在线看 | 亚洲国产成人在线播放 | 91av视频播放 | 在线成人免费av | 美女视频久久黄 | 欧美成人精品欧美一级乱黄 | 欧美另类亚洲 | 日韩专区在线播放 | 国产成人在线综合 | 丁香久久婷婷 | 人人爽人人搞 | 国产精品久久久久久久久蜜臀 | 天天曰 | 亚洲午夜久久久综合37日本 | 日韩精品一区二区三区不卡 | 91精品国产92久久久久 | 在线观看日本高清mv视频 | 射久久 | 午夜精品视频福利 | 午夜18视频在线观看 | 国产一级大片在线观看 | 亚洲涩涩涩| 欧美色精品天天在线观看视频 | 91污视频在线 | 国产精品成人自产拍在线观看 | 国产高清无av久久 | 麻豆传媒视频在线播放 | 久久人人97超碰精品888 | 国产麻豆精品久久 | 欧美日韩亚洲精品在线 | 国产美女精彩久久 | 日韩欧美一区二区在线播放 | 国产精品一区久久久久 | 日日夜夜网 | av电影 一区二区 | 在线观看成人一级片 | 亚洲欧美综合 | 国产亚洲精品成人av久久影院 | 久久综合狠狠综合久久激情 | 欧美伦理一区二区 | 国产a视频免费观看 | 精品二区久久 | 久久精品99国产精品 | 日本中文字幕系列 | 日日躁你夜夜躁你av蜜 | 日本黄网站 | 天天操福利视频 | 亚洲精品乱码久久久久久蜜桃欧美 | 中文资源在线官网 | 狠狠狠操| 欧美少妇的秘密 | 久久综合久久伊人 | 亚洲91中文字幕无线码三区 | 色婷婷激情电影 | 国产高清不卡一区二区三区 | 亚洲精品在线观看免费 | 超级碰视频 | av丝袜天堂 | 精品一区二区日韩 | 色欲综合视频天天天 | 亚洲午夜大片 | 正在播放国产一区二区 | 久久精品最新 | 国产美女主播精品一区二区三区 | 黄色网免费 | 手机看片 | 中文字幕在线视频一区 | a在线视频v视频 | av网站免费线看精品 | 成年人电影免费在线观看 | 日韩在线观看一区 | 天天干天天操av | 91女神的呻吟细腰翘臀美女 | 天天操天天拍 | 天天插综合 | 国产精品青青 | 视频一区在线免费观看 | 国产免费不卡av | 中文字幕精品三级久久久 | 精品1区2区3区 | 狠狠操狠狠干天天操 | 又大又硬又黄又爽视频在线观看 | 精品在线视频一区二区三区 | 欧美国产精品一区二区 | 国产精品国产三级国产aⅴ9色 | 日本中文乱码卡一卡二新区 | 国产亚洲情侣一区二区无 | 91成年人视频 | 天天干天天玩天天操 | 韩日色视频 | 夜又临在线观看 | 这里只有精彩视频 | 成年人在线观看 | 69成人在线 | 婷婷久操| 中文字幕在线有码 | 99精品视频一区 | 国产高清视频免费在线观看 | 亚州精品天堂中文字幕 | 亚洲精品乱码久久久久v最新版 | a视频免费在线观看 | 绯色av一区 | 久久久国产精品一区二区中文 | 午夜精品久久久久久久99 | 国产美女被啪进深处喷白浆视频 | 国产免费高清 | 免费黄色小网站 | 日韩在线小视频 | 久久8精品 | 蜜臀一区二区三区精品免费视频 | 国产a级片免费观看 | 国产综合精品一区二区三区 | 天堂va在线观看 | 一区二区三区在线免费观看 | 久久久噜噜噜久久久 | 久久人操 | 2023年中文无字幕文字 | av免费福利| 亚洲 中文 欧美 日韩vr 在线 | 日本精品视频在线观看 | 久久久激情网 | 久久精品视频免费 | 成人久久久久久久久久 | 999成人 | 丁香导航 | 久操中文字幕在线观看 | 久久国产日韩 | 亚洲最新毛片 | 精品久久久久久久久中文字幕 | av超碰在线观看 | 日韩中文字幕免费视频 | 国产综合小视频 | 一区中文字幕电影 | 日韩精品一区二区三区免费观看 | 成人亚洲精品久久久久 | 国产高清视频色在线www | 久久色在线观看 | 狠狠伊人| 久久久久久久毛片 | 丁香六月天 | 又色又爽又激情的59视频 | 精品99在线观看 | 国产一级黄色片免费看 | 色射爱| 亚洲视频网站在线观看 | 国产 色 | 91精品国产一区 | 91成人在线观看高潮 | 免费合欢视频成人app | v片在线看 | 欧美在线观看视频 | 亚洲人在线7777777精品 | 国产亚洲视频在线观看 | 日韩国产精品一区 | 精品久久1 | 免费观看成人 | 最近2019中文免费高清视频观看www99 | 久久激情婷婷 | 在线成人一区二区 | 婷婷丁香激情综合 | 亚洲高清免费在线 | www.久久久久 | 99re6热在线精品视频 | 久草精品视频 | 国产尤物在线视频 | 九九热久久免费视频 | 午夜av免费观看 | 国产成人精品一区二区三区在线 | 日本xxxx裸体xxxx17 | 国色天香av| 午夜精品视频在线 | 欧美亚洲精品在线观看 | 久久国产精品一区二区三区 | 欧美亚洲成人免费 | 久久久wwww | 久久久久久毛片 | 久久久三级视频 | 在线观看91精品视频 | 欧美aaaxxxx做受视频 | 99色免费视频| 久久久久亚洲最大xxxx | 亚洲三级黄色 | 国产999精品久久久久久绿帽 | www日日| 欧美日韩免费观看一区=区三区 | av短片在线 | 毛片网在线播放 | 91禁在线看 | 久草网站在线 | 国产区免费在线 | 国产欧美日韩精品一区二区免费 | 国产精品视频内 | 国产成人久久精品亚洲 | 国产vs久久| 91高清视频在线 | 香蕉一区 | 亚洲粉嫩av | 96久久久 | 精品国产人成亚洲区 | 九九热精品在线 | 久久99精品视频 | 一区二区三区中文字幕在线观看 | 在线观看一 | 久久,天天综合 | 国内久久久 | 偷拍精偷拍精品欧洲亚洲网站 | 黄色网址中文字幕 | 综合婷婷| 国产精品国产三级国产 | 九九一级片 | 在线观看黄色小视频 | 国产精品一区二区三区视频免费 | 国产伦理剧 | 欧美亚洲久久 | 欧美日韩成人一区 | 精品一区二区三区久久久 | 丁香婷婷亚洲 | 免费看一级特黄a大片 | 97av影院| 黄色aa久久 | 免费91在线观看 | 久久国内免费视频 | 丝袜av一区| 亚洲免费a| 久久av电影| 免费亚洲黄色 | 欧美日韩观看 | 91国内在线 | 狠狠精品 | www操操操 | 特级西西444www大精品视频免费看 | 欧美日韩中 | 欧美性生活一级片 | 欧美激情精品久久 | 91精品久久久久久综合乱菊 | 国产午夜一区二区 | 国产永久免费 | 成年人精品| 一级电影免费在线观看 | 成年人免费看av | 国产一区二区日本 | 成年人视频免费在线播放 | 欧美日韩精品在线播放 | wwwww.国产| 91九色蝌蚪视频网站 | 日韩精品免费一区二区在线观看 | 嫩草91影院| 精品国产一区二区三区久久久久久 | 成人黄色片在线播放 | 日本不卡一区二区 | av黄在线播放| 欧美综合在线视频 | 91av超碰| 国产精品99久久久久 | 黄色资源网站 | 99视频偷窥在线精品国自产拍 | 最新国产福利 | 四虎国产 | 中文字幕国产精品一区二区 | 韩日电影在线观看 | 亚洲成人高清在线 | av在线播放快速免费阴 | 最新日韩电影 | 黄色在线网站噜噜噜 | 国产精品1区| 欧美日韩不卡一区二区三区 | 正在播放一区二区 | 麻豆视频免费在线 | 亚洲国产精彩中文乱码av | 国产99久久久国产 | 欧美精品色 | 夜色成人av | 国产精品视频永久免费播放 | 日日爱影视 | 99热精品国产 | 国产91精品一区二区麻豆网站 | 亚洲人成人99网站 | 色婷婷亚洲综合 | 韩国精品在线观看 | 一区二区中文字幕在线观看 | 久久久久久久久久久影视 | 国产精品久久久一区二区三区网站 | 天堂av影院 | 欧美一区在线观看视频 | 欧美久久久久久久久久久久 | 国产日韩欧美精品在线观看 | 色噜噜日韩精品欧美一区二区 | 91av在线视频播放 | 香蕉视频在线网站 | 人人爱人人射 | 狠狠天天| 亚洲 欧美 国产 va在线影院 | 日韩成人精品 | 国产精品高清一区二区三区 | 国产精品福利在线观看 | 91污视频在线| 91精品国产自产91精品 | 国产精品久久在线观看 | 色综合天天综合在线视频 | 国产精品一区二区你懂的 | 很黄很黄的网站免费的 | 久久精品亚洲综合专区 | 91色偷偷 | 亚洲国产色一区 | 国产精品不卡在线观看 | 国产分类视频 | 久草线| 国产精品二区三区 | 国内精品久久久久久久久久久 | 亚洲视频免费在线看 | 国产高清亚洲 | 草久电影 | 在线观看欧美成人 | 91精品国产99久久久久久久 | 国产精品亚洲片在线播放 | 伊人www22综合色 | 天天操天天射天天操 | 91精选在线观看 | 中文字幕 国产 一区 | 国产精品一区二区精品视频免费看 | 99久久久国产精品免费99 | 一区二区三区免费 | 99精品在线免费视频 | 中文字幕 91 | www.福利 | 永久精品视频 | 不卡的av中文字幕 | 精品国产一区二区三区噜噜噜 | 日本丶国产丶欧美色综合 | 欧美日韩亚洲精品在线 | 97视频在线观看免费 | 深爱激情综合 | 亚洲精品美女视频 | 一级a性色生活片久久毛片波多野 | 激情偷乱人伦小说视频在线观看 | 色综合天天综合 | 久久综合一本 | 韩国一区二区三区视频 | 亚洲综合色视频 | 91大神精品视频在线观看 | 国产亚洲成人网 | 91麻豆精品国产91久久久久久 | 毛片3 | 日本高清中文字幕有码在线 | 在线观看免费高清视频大全追剧 | 中文字幕在线中文 | 高清av中文字幕 | 五月天综合激情网 | 国产福利久久 | 在线免费av电影 | 国产成人精品亚洲日本在线观看 | 伊人电影天堂 | 丝袜制服综合网 | 精品一区二区免费在线观看 | 午夜丁香网 | 国产高清久久久久 | avlulu久久精品 | 国产日韩精品一区二区在线观看播放 | 久久9999久久 | 91字幕 | 国产精品男女啪啪 | av在线精品 | 日韩电影在线观看中文字幕 | 欧美精品亚洲精品 | 国产成人精品午夜在线播放 | 久久免费99 | 精品一区二区精品 | 国产高清视频网 | 亚洲开心激情 | 国产精品久久久久免费观看 | 欧美aⅴ在线观看 | 中文久草 | 成人黄色电影在线播放 | 麻豆免费看片 | 国产视频一区二区在线 | 欧美午夜a | 天天干天天操天天拍 | 国产精国产精品 | 国产精品av久久久久久无 | 91一区二区三区在线观看 | av经典在线 | 欧美激情精品久久久久久变态 | 久久影视一区二区 | 亚洲最大av网站 | 在线播放日韩av | 久久这里只有精品首页 | 免费91在线观看 | 成人cosplay福利网站 | 欧美性极品xxxx娇小 | 黄色av网站在线观看免费 | 久久一级电影 | 国产亚洲精品久久久久秋 | 久久男人中文字幕资源站 | 中文字幕资源网 国产 | 国产精品99久久99久久久二8 | 日日操狠狠干 | 免费观看91视频大全 | 色综合色综合色综合 | 99精品偷拍视频一区二区三区 | 韩国av一区二区 | 免费观看一区 | 免费黄色激情视频 | 国产一级高清视频 | 国产高清在线免费 | 手机看片国产日韩 | 91在线观看视频网站 | 婷婷丁香激情综合 | 香蕉视频在线看 | 成人av视屏 | 二区三区毛片 | 99视频在线观看免费 | 欧美日韩中文另类 | 中文字幕在线观看免费高清电影 | 97人人爽人人| 免费观看全黄做爰大片国产 | 91av在线免费视频 | 91九色蝌蚪在线 | 中文字幕在线第一页 | 亚洲专区在线播放 | 精品国产诱惑 | 国产精品99久久久久久有的能看 | 黄色天堂在线观看 | 超碰免费成人 | 国产精品视频你懂的 | 高清视频一区二区三区 | 久久成| 中文字幕精品三区 | av品善网| 中文字幕一区二区在线播放 | 97av精品 | 色香网 | 最新日韩视频在线观看 | 精品一区二区三区久久久 | 免费精品人在线二线三线 | 18pao国产成视频永久免费 | 国产剧情av在线播放 | 天天天天射 | 久久日韩精品 | 五月天激情综合 | 国产99久久精品一区二区永久免费 | 精品亚洲免费视频 | 91手机在线看片 | 国产午夜精品一区二区三区四区 | 毛片黄色一级 | 国产视频在线免费观看 | 国产美女精品视频 | 日韩大片在线播放 | av电影 一区二区 | 久久激情五月婷婷 | 国产精品一区二区中文字幕 | 黄色一级在线免费观看 | 日韩欧美在线国产 | 91精品国产九九九久久久亚洲 | 国产精品免费观看国产网曝瓜 | 午夜久久网站 | 国产美女永久免费 | 日韩高清一区在线 | 亚洲国产中文字幕在线观看 | 国产精品免费久久久久久 | 天天激情在线 | 婷婷婷国产在线视频 | 婷婷色综 | 日韩一片| 亚洲三级视频 | 欧美91精品久久久久国产性生爱 | 极品久久久 | a精品视频| 亚洲欧洲国产精品 | 国产黄色精品在线观看 | 亚洲精品在线观看视频 | 中文字幕一区二区在线观看 | 视频在线观看亚洲 | 久久高清免费视频 | 久久草精品 | 欧美综合在线视频 | 在线播放 日韩专区 | 丁香色婷 | 天堂素人在线 | 欧美成人精品欧美一级乱 | 日本久久久亚洲精品 | 天天爽夜夜爽精品视频婷婷 | 欧美做受xxx | 四虎永久网站 | 亚洲毛片一区二区三区 | 草莓视频在线观看免费观看 | 91视频电影 | 国产精品一区二区久久精品爱微奶 | 国产日韩精品一区二区三区在线 | 久草视频在线免费播放 | 99久久er热在这里只有精品66 | 狠狠色婷婷丁香六月 | 日日夜夜精品免费观看 | 在线观看日本高清mv视频 | 婷五月激情 | 色综合天天视频在线观看 | 天堂资源在线观看视频 | 久久精品国产一区二区电影 | 国内精品久久久久久久久久清纯 | 久久久综合香蕉尹人综合网 | 99热精品国产 | 精品不卡av | 99亚洲国产| 99精品黄色片免费大全 | 草久草久| 免费福利片2019潦草影视午夜 | 国产亚洲在线观看 | 黄色三级视频片 | 亚洲精品久久久久中文字幕二区 | 日韩av中文在线观看 | 在线观看一区二区视频 | 久久精品国产一区 | 免费观看性生交大片3 | 成人免费观看大片 | 黄色成品视频 | 久久国产影院 | 日韩视频免费播放 | 麻豆成人精品 | 免费网站在线观看成人 | 韩国精品福利一区二区三区 | 日韩激情第一页 | 久久久免费播放 | 特片网久久 | 网站你懂的 | 丁香资源影视免费观看 | 国产成人亚洲在线观看 | 不卡电影一区二区三区 | 精品国产一区二区三区四区vr | 久久视频免费 | 91人人澡| 在线免费观看av网站 | 国产福利电影网址 | 国产一区久久 | 午夜精品久久久久久久99热影院 | 天天色天 | 精品视频在线免费观看 | 99国产视频在线 | 激情综合一区 | 国产亲近乱来精品 | 成人免费精品 | 18久久久久 | 久久久久国产精品午夜一区 | 欧美另类高潮 | 91天天视频| 久久久久成人精品免费播放动漫 | 久久一精品| 婷婷深爱网 | 亚洲女人av| 国产一区免费观看 | 色婷婷激情网 | 亚洲国产精品va在线看黑人动漫 | 国产亚洲精品中文字幕 | 麻豆传媒视频在线免费观看 | 国产精品 日本 | 激情综合狠狠 | 免费在线观看成人小视频 | 国产精品剧情在线亚洲 | www.国产在线观看 | 日本三级香港三级人妇99 | 欧美日韩激情视频8区 | 亚洲精品欧美精品 | 久久精品香蕉 | 久久人人爽爽人人爽人人片av | 波多野结衣久久资源 | 亚洲精品看片 | 国产麻豆果冻传媒在线观看 | 午夜精品一区二区三区可下载 | 亚洲欧美日韩一区二区三区在线观看 | 亚洲精品久久久蜜桃 | www蜜桃视频 | 久久久久黄色 | 久久久久久久久久久国产精品 | 五月激情亚洲 | 国产大陆亚洲精品国产 | 国产福利在线不卡 | 日本三级久久 | 国产精品美女在线 | 日本久久久久久久久 | 精品毛片久久久久久 | 青青草国产精品 | 狠狠色综合网站久久久久久久 | 日韩性xxx| 欧洲高潮三级做爰 | 欧美成人高清 | 日韩欧美电影在线 | 狠狠88综合久久久久综合网 | 成年人网站免费观看 | 中文字幕在线成人 | 精品国产成人在线影院 | 欧美精品久久久久a | 五月婷婷在线观看视频 | 日韩精品不卡在线观看 | 韩国一区二区在线观看 | 99c视频高清免费观看 | 成人亚洲综合 | 亚洲乱亚洲乱亚洲 | 欧美精品久久 | 亚洲成人精品久久久 | 在线观看午夜av | 久久精品网站免费观看 | 国产小视频国产精品 | 97国产大学生情侣白嫩酒店 | 日本公妇在线观看 | 西西444www大胆高清视频 | 精品福利视频在线 | 日韩高清一二区 | 亚洲日韩欧美一区二区在线 | 国产亚洲精品中文字幕 | 黄色网中文字幕 | 天天操天天操天天操天天 | 丁香九月激情综合 | 免费看黄视频 | 国产成人精品一区二 | 精品国产乱码久久久久久久 | 欧美黑人xxxx猛性大交 | 美腿丝袜一区二区三区 | 亚洲一区黄色 | 婷婷六月色 | 日韩有码在线播放 | 日韩高清片 | 亚洲精选在线观看 | www.国产在线 | 最近中文字幕完整高清 | 色婷婷免费视频 | 日韩精品无码一区二区三区 | 国产精品久久久久久久久久久不卡 | 蜜臀av一区 | 五月婷久久 | 99久精品视频 | 中文字幕人成乱码在线观看 | 九九九九精品九九九九 | 亚洲精品美女久久久久网站 | 中文av影院| 黄色网址在线播放 | 亚洲精品日韩在线观看 | 久久国产网 | av免费电影网站 | 国产黄色av | 九九免费在线观看视频 | 亚洲激情小视频 | 在线国产精品视频 | 国产精品av在线 | 在线视频 影院 | 中文字幕乱码亚洲精品一区 | 国产91亚洲 | 久久视频免费在线 | 婷婷精品| 成人国产精品久久久久久亚洲 | 黄色日本免费 | 丁香视频 | 女人18片毛片90分钟 | 国产成人精品一区二区三区免费 | 亚洲成 人精品 | 久久99久久99精品免视看婷婷 | 成人一级黄色片 | 午夜体验区 | 亚洲成熟女人毛片在线 | 97电影手机| 亚洲最新在线视频 | 黄色午夜 | 亚洲精品一区二区18漫画 | 97人人看| 国产在线更新 | 国产精品激情 | 波多野结衣精品在线 | 国产一二区在线观看 | 中国一级片视频 | 国产精品久久久久久久电影 | 日日夜夜天天 | 97国产精品亚洲精品 | 97国产精品亚洲精品 | 中文字幕av免费观看 | 欧洲不卡av | 好看av在线 | 久久成人国产精品 | 制服丝袜亚洲 | 99精品国产一区二区三区不卡 | 天干啦夜天干天干在线线 | 国精产品永久999 | 日本精品中文字幕在线观看 | 国内精品久久久精品电影院 | 免费成人短视频 | 国产视频二 | 日本精品久久久久影院 | 少妇bbbb搡bbbb桶 | 亚洲黄色片在线 | 五月天综合色激情 | 青青河边草免费观看 | 久久婷婷一区二区三区 | 操久久免费视频 | 伊人久久国产精品 | 婷婷综合五月天 | 日韩精品无码一区二区三区 | 久久国产精品第一页 | www.午夜色.com | 二区三区在线 | 午夜精品久久久99热福利 | 日日夜夜精品免费观看 | 国产精品欧美久久久久三级 | 99在线视频免费观看 | 色五婷婷 | 在线 成人 | 一区二区三区日韩视频在线观看 | 日日操天天爽 | 97在线精品视频 | 国产69久久久 | 99国产在线视频 | a黄色一级| 国产成人中文字幕 | 狠狠干夜夜操天天爽 | 久久人人爽人人爽人人片av免费 | 亚洲最大色| 欧美日韩国产成人 | 高清av网 | 久久视频精品在线 | 中文字幕日本特黄aa毛片 | 色吊丝在线永久观看最新版本 | 精品免费视频123区 午夜久久成人 | 成人久久免费视频 | 久久综合五月天婷婷伊人 | 国产vs久久| 九九九在线 | 国产精品毛片久久蜜 | 美女视频又黄又免费 | 91污污| 国产精品二区在线观看 | 亚洲 中文 欧美 日韩vr 在线 | 中文有码在线 | 精品一区二区免费在线观看 | 97天堂| 日韩免费电影 | 久久免费电影网 | 欧美另类tv | 国产福利精品一区二区 | 久久爱综合 | 天天色草 | www久久精品 | 九色精品免费永久在线 | 在线观av | 伊人影院在线观看 | 中文字幕精品一区久久久久 | 91九色视频国产 | 久操久 | 免费观看www小视频的软件 | 中文字幕在线观看免费高清完整版 | 国产91全国探花系列在线播放 | 日本婷婷色| 九九九九九九精品任你躁 | 99久久久精品| 免费日韩一区二区 | 久久免费的视频 | 精品一区二区免费视频 | 免费观看av | 国产手机视频在线观看 | 激情丁香5月 | 日韩在线电影一区 | 亚洲最大av在线播放 | 五月婷在线 | 国产精品福利视频 | 91黄色小网站 | 00av视频| 五月天激情婷婷 | 日韩av中文 | 日本精品中文字幕在线观看 | 99久久精品国产免费看不卡 | 久久色网站 | 97电院网手机版 | 免费看十八岁美女 | 成年人免费在线播放 | 欧美综合色在线图区 | 久久久久久久国产精品 | 日韩精品中文字幕在线播放 | japanesexxxhd奶水| 97免费在线观看视频 | 国产黄色片在线 | 久久综合九色欧美综合狠狠 | 国产免费又粗又猛又爽 | 午夜婷婷在线播放 | 97国产在线观看 | 免费高清男女打扑克视频 | 99综合影院在线 | 国产不卡精品视频 | 久久久精品成人 | 久久综合成人网 | 成年人视频在线 | 亚洲成人av电影 | 国产成人免费在线观看 | 亚洲欧美综合精品久久成人 | 99久久精品久久久久久动态片 | 欧美一区,二区 | 99国产高清 | 亚洲一区二区三区四区精品 | 亚洲高清视频在线观看免费 | 9在线观看免费高清完整 | 97超碰成人 | 日韩激情第一页 | 超碰97在线资源 | 99在线观看精品 | 国产日产精品一区二区三区四区的观看方式 | 国产黄色播放 | 久久好看免费视频 | 亚洲国产97在线精品一区 | 九九免费在线观看视频 | 成人黄色视 | 99免费在线观看 | 成人av电影免费在线观看 | 最新黄色av网址 | 欧美精品一区二区三区一线天视频 | 中文字幕资源网 国产 | 亚洲婷婷综合色高清在线 | 人人草在线视频 | www.久久免费 | 中文字幕免费在线看 | 99在线视频播放 | 新版资源中文在线观看 | 韩国一区二区三区在线观看 | 四虎国产精品永久在线国在线 | 欧美巨大荫蒂茸毛毛人妖 | 日韩综合色 | 免费男女羞羞的视频网站中文字幕 | 久久国产一区二区三区 | 国产精品岛国久久久久久久久红粉 | 97精品国自产拍在线观看 | 亚洲 欧美 国产 va在线影院 | 在线视频一区观看 | 在线 欧美 日韩 | 亚洲精品五月 | 中字幕视频在线永久在线观看免费 | av成人免费在线观看 | 久草在线中文视频 | 在线观看成人福利 | 免费一级特黄毛大片 | 五月丁婷婷 | 在线观看国产www | 一级黄色片在线播放 | 一级成人免费视频 | 国产色爽 | 日韩天天综合 | 99草视频在线观看 | 久久亚洲二区 | 免费精品| 日韩激情小视频 | 国产午夜三级一区二区三 | 蜜桃av久久久亚洲精品 | 成人h视频在线播放 | 欧美日韩高清一区二区 | www九九热| 久久国产高清视频 | 久草91视频 | 国产精品久久久久毛片大屁完整版 | 日韩另类在线 | 久草观看视频 | 99中文字幕在线观看 | 99视频精品免费视频 | 六月激情久久 | 韩国av一区二区三区 | 日韩电影在线观看一区二区三区 | 人人爱人人添 | 国产中文字幕久久 | 在线观看视频精品 | 香蕉91视频 | 在线成人免费 | 91香蕉视频黄色 | 日韩另类在线 | 毛片激情永久免费 | 天天射天天干天天 | 国产午夜精品久久 | 91精品免费在线 | 精品特级毛片 | 一级淫片在线观看 | 成人动漫一区二区 | 久草在线视频免费资源观看 | av黄免费看 | 人人爽人人爽人人爽 | 国产亚洲精品bv在线观看 | 91看片看淫黄大片 | 国产在线综合视频 | 日韩中文字幕视频在线观看 | 99精品国产兔费观看久久99 | 久草免费电影 | 成人av一区二区三区 | 国产精品成人av电影 | 激情久久久 | 国产一级片不卡 | 婷婷激情综合五月天 | 婷婷久久五月天 | 黄色一级免费 | 91精品999 | 91av在线免费看 | 国产在线不卡精品 | 中文字幕精品视频 | 久久国产精品久久久 | 中文字幕美女免费在线 | 天天操网址 | 亚洲理论在线观看电影 | 成人av免费在线 | 视频一区在线播放 | 国产精品日韩在线观看 | av导航福利 | 免费日韩 | 91在线www| 国产综合精品一区二区三区 | 9在线观看免费高清完整 | 国产在线精品福利 | 一区二区三区日韩在线 | 久久久久久久久久久网 | 日本爱爱免费 | 精品一区二区免费视频 | 91人人爽人人爽人人精88v | av在线免费播放网站 | 国产精品国产三级国产 | 91麻豆精品国产91 | 在线小视频 | 欧美色图视频一区 | 国产精品毛片久久久久久久 | 色婷婷导航 | 亚洲精品国内 | 天天操网址| 美女视频是黄的免费观看 | 青青网视频 | 欧美黄网站 | 开心丁香婷婷深爱五月 | 女女av在线 | 五月天婷婷免费视频 | 中文字幕一区2区3区 | 一本一本久久a久久精品综合妖精 | 婷婷国产v亚洲v欧美久久 | 96久久精品| 黄色小说免费在线观看 | 国产精品一区二区三区四区在线观看 |