日韩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设置界面修改总结的全部內容,希望文章能夠幫你解決所遇到的問題。

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

国产精品 美女 | 免费a v观看 | 成年人网站免费观看 | 国产97视频在线 | 四虎在线观看视频 | 日本超碰在线 | 一区二区三区四区精品视频 | 亚洲精品在线播放视频 | 亚洲天天在线 | 久久久久亚洲精品中文字幕 | 97超碰国产精品 | 国产一二三四在线观看视频 | 亚洲不卡123| 丁香视频在线观看 | 九九久久久 | 一区二区三区日韩视频在线观看 | 亚洲黄色av| 免费看片成人 | 国产美女精品视频免费观看 | 久久伦理电影网 | 精品国产乱码一区二 | 丁香六月天婷婷 | 欧美精品xx | 色婷婷亚洲| 成年人毛片在线观看 | 国产明星视频三级a三级点| 日韩精品中文字幕久久臀 | 国产精品手机播放 | 免费亚洲电影 | 狠狠操操操 | 高清av免费一区中文字幕 | 亚洲一区日韩 | 成人av在线影视 | 免费久久精品视频 | 久久免费中文视频 | 99在线精品观看 | 国产96在线观看 | 精品国产免费av | 国产精品久久久久久久电影 | 色婷婷九月| www.黄色片网站 | 成年人视频免费在线播放 | 日韩成人高清在线 | 91视频在线国产 | 人人艹视频| 色网站在线免费 | 麻豆va一区二区三区久久浪 | 久久久九九 | 精品久久久久久国产91 | 国产精品21区 | 午夜免费在线观看 | 久久精品久久久精品美女 | 亚洲欧美在线视频免费 | 久久99在线视频 | 福利视频网站 | 久久久久久久久久网 | 欧美性粗大hdvideo | 久久96国产精品久久99软件 | 亚洲欧美视频一区二区三区 | 成人aⅴ视频 | 色综合久久88色综合天天免费 | 久久在现 | 精选久久 | 日日夜夜精品视频天天综合网 | 成人精品国产 | 久久久久久久久福利 | 日韩精品电影在线播放 | 久草网视频 | 欧美地下肉体性派对 | 天天干夜夜爽 | 日韩av网页 | 精品一区二区三区久久久 | 91| 国产精品福利午夜在线观看 | 日韩欧美在线免费观看 | 欧美激情综合色综合啪啪五月 | 国产精品美女久久久免费 | 日韩精品最新在线观看 | 97av在线视频| 久久综合欧美精品亚洲一区 | 91热这里只有精品 | 亚洲欧美国产精品18p | 欧美成人影音 | 国产精品国产亚洲精品看不卡15 | 91久久奴性调教 | 人人爽人人爽 | 2019中文| 最近最新mv字幕免费观看 | 日本三级全黄少妇三2023 | 午夜婷婷在线观看 | 亚洲h色精品 | 久久黄色精品视频 | 精品在线看 | 草久久久久 | 国产精品麻 | 亚洲无线视频 | aa级黄色大片 | 婷婷综合伊人 | 婷婷视频| 一区二区在线电影 | 久久久网站 | 国产乱老熟视频网88av | 在线你懂 | 免费观看日韩 | 欧美精品久久久久久久亚洲调教 | 欧美精彩视频在线观看 | 久草视频在线免费播放 | 91在线视频免费观看 | 九九在线播放 | 欧美日韩国语 | 一区二区成人国产精品 | 久久不见久久见免费影院 | 亚洲激情视频在线 | 天天在线免费视频 | 在线观看视频日韩 | 91成年人视频 | 91视频一8mav | 国产麻豆剧传媒免费观看 | 久久国产精品99久久久久 | 免费看v片 | av性网站 | 欧美做受高潮1 | 在线黄色国产电影 | 亚洲精欧美一区二区精品 | 日韩精品一区二区三区外面 | 久久亚洲视频 | 狠狠干 狠狠操 | 狠狠干夜夜操天天爽 | 91久久人澡人人添人人爽欧美 | 日免费视频 | 成人一区二区三区中文字幕 | 成人免费观看网址 | 中文字幕专区高清在线观看 | 国产成人一区二区三区 | 成人app在线免费观看 | 日韩亚洲国产中文字幕 | www.久久久精品 | 91精选在线观看 | 韩日三级av| av看片在线 | 久久美女免费视频 | 91热视频在线观看 | 中文字幕在线观看第一页 | 天天操天天操 | 天天干 夜夜操 | 国产伦精品一区二区三区四区视频 | 国产福利91精品 | 久草爱视频 | 亚洲一级二级 | 2024av| 国产精品日韩 | 91污视频在线 | 高清视频一区 | 中文字幕在线观看av | 成在人线av | 国产精品久久久久9999吃药 | 在线精品视频免费播放 | 久久久国产电影 | 日韩a在线| 欧美激情精品久久久久久免费 | 综合久久五月天 | 青春草视频 | 欧美国产一区在线 | 久艹在线观看视频 | www.五月天 | 免费日韩精品 | 亚洲第一区在线观看 | 99久久久| 亚洲天堂精品视频在线观看 | 国产精品嫩草69影院 | 丝袜制服综合网 | 欧美精品九九99久久 | 免费看国产曰批40分钟 | 久久免费视频2 | 在线观看免费观看在线91 | 成人av网站在线观看 | 久久免费视屏 | 97在线观看 | 国产午夜精品福利视频 | 欧美一区二区三区四区夜夜大片 | 亚洲精品国产成人av在线 | www.久草视频| 久久午夜精品视频 | 区一区二区三区中文字幕 | 日韩和的一区二在线 | 久久国内精品视频 | 久久综合狠狠综合久久综合88 | 成人黄大片视频在线观看 | 免费看十八岁美女 | 欧美日韩国产一二三区 | 91视频在线网址 | av看片在线 | 一区二区男女 | 粉嫩av一区二区三区入口 | 91网站在线视频 | 五月婷婷在线综合 | 国产黄色精品视频 | 国产一级h | 一本一道波多野毛片中文在线 | 91热在线| 日韩网站中文字幕 | 成人啪啪18免费游戏链接 | 五月激情六月丁香 | 成年人电影免费在线观看 | 嫩小bbbb摸bbb摸bbb| 国产aaa免费视频 | 九月婷婷综合网 | 在线成人免费电影 | 亚洲国内在线 | 91桃色在线免费观看 | 国产麻豆果冻传媒在线观看 | 欧美va日韩va | 在线影院 国内精品 | 国产精品入口a级 | 色综合久久中文综合久久牛 | 中文字幕av免费观看 | 亚洲免费永久精品国产 | 色噜噜日韩精品一区二区三区视频 | 91少妇精拍在线播放 | 久99久精品视频免费观看 | 视频精品一区二区三区 | 成人在线播放免费观看 | 黄色影院在线免费观看 | 日本久久久亚洲精品 | 国产不卡视频在线 | 成人久久久久久久久久 | 国产一级黄色免费看 | 国产精品网址在线观看 | 亚洲电影一区二区 | 成人影视免费 | 中文字幕免费 | 三级在线视频播放 | 国产精品毛片一区 | 国产精品99久久久久久久久久久久 | 欧美日韩免费一区 | 日韩高清 一区 | av资源免费在线观看 | 欧美亚洲精品一区 | 欧美aaa视频 | 97精品国产97久久久久久春色 | 综合久久久久 | 综合黄色网 | 国产成人三级三级三级97 | 伊人影院av | 亚洲精品国产精品国自产 | 亚洲欧美一区二区三区孕妇写真 | 丁香视频全集免费观看 | 香蕉视频在线视频 | 91精品一区二区在线观看 | 亚洲欧洲精品一区 | 激情av五月婷婷 | 少妇bbb搡bbbb搡bbbb′ | 国内精品中文字幕 | 黄色国产在线 | 综合网婷婷 | 最近中文字幕第一页 | 亚洲欧美视频一区二区三区 | 五月花激情 | 日韩最新中文字幕 | 国产精品一区二区美女视频免费看 | 久久久久久久久久影院 | 久久久国产一区二区三区四区小说 | 麻豆视频免费入口 | 国产一级免费播放 | 国产黄色片一级 | 亚洲欧洲一区二区在线观看 | 欧美极度另类性三渗透 | 96av在线视频 | 久久精品一区二区 | 国产成人在线精品 | 国产一二三四在线视频 | 91在线九色| 美女视频是黄的免费观看 | 99热99re6国产在线播放 | 夜夜爽88888免费视频4848 | 欧美日韩精品二区第二页 | 免费一级日韩欧美性大片 | 久久国产经典 | 日韩欧美在线视频一区二区三区 | 久久久福利视频 | 久草在线视频在线 | 激情 一区二区 | 久久夜色精品国产欧美乱极品 | 欧美日性视频 | 成人亚洲精品久久久久 | 国产资源av | 色丁香综合| 日韩中文字幕免费 | 91av在线免费观看 | 亚洲免费在线播放视频 | 国产视频精品免费播放 | 视频91| 一本一本久久a久久精品综合妖精 | 2018好看的中文在线观看 | 在线免费观看羞羞视频 | 亚洲精品高清一区二区三区四区 | 992tv成人免费看片 | 国产国语在线 | 不卡日韩av | 99色精品视频| 欧美日韩一区二区视频在线观看 | 久久视频这里有精品 | 99免费在线视频 | 五月天久久激情 | 婷婷色中文字幕 | 91精品视频导航 | 黄污视频网站 | 91亚洲狠狠婷婷综合久久久 | 精品国产一区二区三区不卡 | 成人av中文字幕 | 欧美日本在线视频 | 久久久久亚洲精品中文字幕 | 精品久久久久久电影 | 亚洲精品国产片 | 98精品国产自产在线观看 | 欧美精品久久人人躁人人爽 | 欧美性极品xxxx做受 | 日韩国产欧美视频 | 国内精品在线看 | 黄av资源 | 色夜影院 | 国产成人一区二区三区久久精品 | 中文字幕字幕中文 | 久久视频在线看 | 深夜视频久久 | 久久久免费少妇 | 91传媒在线| 99热这里有 | 中文字幕av全部资源www中文字幕在线观看 | 国产综合福利在线 | 毛片精品免费在线观看 | 欧美色图p | 一区二区三区四区免费视频 | 色婷婷在线观看视频 | 99热.com| 97日日碰人人模人人澡分享吧 | 免费久久99精品国产 | 欧美精品一区二区三区四区在线 | 91色蜜桃 | 亚洲精品av在线 | 日韩视频 一区 | av网站在线观看播放 | 青春草视频在线播放 | 伊人影院99 | 在线免费色视频 | 国产美女精品久久久 | 搡bbbb搡bbb视频 | 免费看的国产视频网站 | 国产精品成人久久久久 | 国产偷v国产偷∨精品视频 在线草 | 99视频在线精品 | 精品 一区 在线 | 国产精品成人免费一区久久羞羞 | 久久久久99精品国产片 | 久久久久久国产精品美女 | 综合色伊人 | 在线观看a视频 | 人人爽久久涩噜噜噜网站 | 91av在线免费播放 | 国产精品免费一区二区 | 91久久影院| 欧美激情xxxx | 五月天六月色 | 免费一区在线 | 色香蕉在线视频 | 日韩专区一区二区 | 久久久久久久久久网站 | 亚洲精品欧美精品 | 伊人六月 | 久久精品成人热国产成 | 欧美性网站| 久草视频网 | 国产在线精品一区二区三区 | 久久天天躁狠狠躁夜夜不卡公司 | 香蕉在线视频播放网站 | 国产专区精品视频 | 国产在线中文字幕 | 日本久热| 日韩三级免费 | a天堂最新版中文在线地址 久久99久久精品国产 | 十八岁以下禁止观看的1000个网站 | av免费看在线| 久久综合狠狠综合久久激情 | 欧美精品一区二区免费 | 97超级碰碰 | 久久96国产精品久久99漫画 | 91av在线视频播放 | 久久99国产精品自在自在app | av免费观看高清 | 久久精品婷婷 | 欧美性极品xxxx做受 | 国产馆在线播放 | 久久刺激视频 | 色橹橹欧美在线观看视频高清 | 日韩视频在线观看免费 | 国产二区精品 | 久久高清国产视频 | 国产精品一区专区欧美日韩 | 日韩久久久久久久久久久久 | 黄色大全在线观看 | 欧美最猛性xxx | 成人久久久久久久久久 | 麻豆国产网站入口 | 日本性高潮视频 | 在线观看av大片 | 99国产精品 | 国产美女免费观看 | 97超视频在线观看 | av性网站 | 国产精品久久久久永久免费观看 | 亚洲dvd | 午夜精品久久久久久久99 | 久久成人综合 | 日本中文字幕网址 | 免费日韩一区二区三区 | 亚洲天堂社区 | 草久电影 | 久久免费99精品久久久久久 | 中日韩在线视频 | 中文字幕在线久一本久 | 99久久日韩精品免费热麻豆美女 | 精品综合久久久 | 99久久久国产精品免费观看 | 久久综合久久综合这里只有精品 | 国产精品中文字幕在线播放 | 欧美日韩1区2区 | 色婷婷国产 | 黄色av网站在线观看免费 | 国内精品福利视频 | 成人精品99| 亚洲第一中文网 | 国产免费久久av | 免费十分钟 | 久久久久久久久毛片精品 | 成人在线播放免费观看 | 久久精品99国产精品亚洲最刺激 | 亚洲高清视频在线 | 午夜精品av | 操操操干干干 | 99热精品免费观看 | 色婷婷免费视频 | 久久精品影视 | 国产精品成人一区二区 | 亚洲精品黄色 | 国产亚洲精品久久久久久久久久久久 | 精品专区| 亚洲精品国偷拍自产在线观看 | 亚洲91av| 亚洲激情一区二区三区 | 精品久久1 | 日韩在线观看视频一区二区三区 | 久久91网 | 97色在线观看 | 伊人丁香 | 久久艹国产视频 | 五月天天色 | 亚洲精品午夜久久久久久久久久久 | a√天堂资源 | av三级在线播放 | 一区二区三区免费网站 | 黄色亚洲在线 | 六月丁香六月婷婷 | 国产精品久久中文字幕 | 欧美夫妻生活视频 | 最近中文字幕第一页 | 伊人视频 | av一区在线 | 99久久这里有精品 | 最近中文字幕完整视频高清1 | www.狠狠色.com| 国产一二三区av | 国产99久久九九精品免费 | 91福利视频久久久久 | 特黄特色特刺激视频免费播放 | 成人黄色中文字幕 | 色干干| 久久露脸国产精品 | 亚洲欧洲在线视频 | 97超碰免费在线观看 | 婷婷av色综合 | 日韩久久一区二区 | av看片网址 | 黄网站免费大全入口 | 国产精品9区| 最新婷婷色| 日韩四虎 | 国产成人在线精品 | 日本一区二区免费在线观看 | 成人动漫精品一区二区 | 亚洲国产网址 | 啪啪精品 | 中文字幕成人在线 | 9999在线观看 | 91精品国产成人 | 国产福利91精品张津瑜 | 91经典在线 | 免费观看版 | 国产在线观看不卡 | 日日夜夜亚洲 | 欧美专区国产专区 | 亚洲精品高清视频在线观看 | 亚洲日本va午夜在线电影 | 黄色国产在线观看 | 午夜av在线| 97色se| 中文字幕第一页在线视频 | www.夜夜爱| 欧美日韩一区二区久久 | 久草免费在线视频观看 | 久久久久综合视频 | 久久久黄视频 | 一级成人免费视频 | 亚洲电影一区二区 | 免费在线观看av网址 | 久久久国产精华液 | 久久成年人网站 | 奇米四色影狠狠爱7777 | 视频在线观看99 | 国产精品美女久久久久久免费 | 在线精品视频免费观看 | 欧美一级片在线观看视频 | 成人久久久精品国产乱码一区二区 | 成人亚洲欧美 | 天天操天天舔天天干 | 亚洲精品综合一区二区 | www.777奇米| 久久久www成人免费毛片麻豆 | 丁香资源影视免费观看 | 日日碰狠狠添天天爽超碰97久久 | 国产做爰视频 | 婷婷丁香激情网 | 狠狠干.com| 久久精品激情 | 婷婷精品国产欧美精品亚洲人人爽 | 日韩xxx视频 | 久久久久免费网 | 激情婷婷在线 | av电影在线观看 | 毛片网站免费在线观看 | 欧美一级日韩免费不卡 | 国产精品久久久久久久免费 | 日本视频网 | 日日夜夜人人天天 | 在线观看岛国av | 999久久久欧美日韩黑人 | 丁香网五月天 | 大胆欧美gogo免费视频一二区 | 成年人免费看的视频 | 18做爰免费视频网站 | 99精品久久99久久久久 | 操操操天天操 | 99999精品视频 | 日本xxxx裸体xxxx17 | 蜜臀av性久久久久av蜜臀妖精 | 激情欧美丁香 | 成人精品久久 | 1024久久 | 亚洲成av人片在线观看无 | 粉嫩高清一区二区三区 | 国产乱老熟视频网88av | 蜜臀久久99精品久久久无需会员 | 狠狠地操| 97视频在线免费 | 精品一区二区久久久久久久网站 | 久久久久久久久福利 | 日韩高清 一区 | 亚洲人片在线观看 | 亚洲片在线资源 | 黄色小网站在线 | av手机版 | 国产视频色 | 日韩成人免费电影 | 97超碰在线资源 | 在线亚洲小视频 | 国产精品成人一区二区 | 久久久久免费看 | 狠狠干狠狠艹 | 丝袜制服天堂 | 麻豆va一区二区三区久久浪 | 97在线免费观看 | 在线观看亚洲a | 美女精品国产 | 亚州av一区 | 久久天天躁狠狠躁亚洲综合公司 | 天天天综合 | 亚洲人人射 | 久久99精品一区二区三区三区 | 中文字幕在线观看不卡 | 国产精品va在线播放 | 在线观看91网站 | 国产码电影 | av久久在线 | 九九免费在线看完整版 | 美女网站视频色 | 福利视频第一页 | 成人97视频一区二区 | 五月天色综合 | 午夜10000| 成 人 黄 色 片 在线播放 | 狠狠干夜夜操 | 玖玖玖国产精品 | 精品久久一区二区三区 | 亚洲美女视频在线观看 | 久久国产精品99久久人人澡 | 久久久精品一区二区 | 亚洲综合在线播放 | 在线观看日本高清mv视频 | 91高清视频 | 在线日韩一区 | 在线播放亚洲 | 国产精品专区在线 | 国产精品久久久久久久久费观看 | 日韩一级片大全 | 免费在线观看日韩欧美 | 久久精品毛片 | 亚洲电影影音先锋 | 成人在线视频免费看 | 国产又粗又猛又爽 | 亚洲国产97在线精品一区 | 日韩精品免费一区二区三区 | 亚洲精品成人网 | 一区二区伦理电影 | 91成人国产 | 日韩在线视频不卡 | 伊人首页| 婷婷天天色 | 欧美激情精品久久久 | 久久久精品视频网站 | 在线观看精品黄av片免费 | 免费看片亚洲 | 国产精品免费小视频 | 日韩三级.com| 久久精彩免费视频 | 天天干,天天干 | 国产视频1 | 国产视频日本 | 久久爱992xxoo | 久久久国产精品视频 | 看污网站 | 久草亚洲视频 | 在线视频 成人 | www视频免费在线观看 | 在线观看日韩中文字幕 | 色老板在线 | 麻豆视频www| 高清在线一区二区 | 国产麻豆传媒 | 国产成人精品久久亚洲高清不卡 | 国产 视频 高清 免费 | 99视屏| 国产精品美女免费看 | 日韩在线观看网站 | 亚洲黄色片在线 | 午夜91视频 | 成人午夜黄色 | 欧美99热 | 亚洲区另类春色综合小说 | 手机av片| 久久久首页 | 99精品视频免费在线观看 | 亚洲理论在线观看 | 狠狠色狠狠综合久久 | 久久99精品久久久久久秒播蜜臀 | 少妇搡bbbb搡bbb搡忠贞 | 丁香5月婷婷久久 | 中文字幕在线播放一区二区 | av观看免费在线 | 狠狠五月婷婷 | 91在线观看高清 | 久久久久久久av麻豆果冻 | 国产成人高清 | 天天插天天狠 | 国产在线观看黄 | 中文字幕一区二区三区乱码在线 | 国产美女在线免费观看 | 欧美在线不卡一区 | 丁香视频 | 狠狠干2018 | 国产精品久久久久久久久久久久午夜片 | 久久黄色a级片 | 91桃色国产在线播放 | 中文字幕一区二区在线观看 | 四虎免费在线观看 | 午夜少妇一区二区三区 | 四虎国产免费 | 久久只精品99品免费久23小说 | 特及黄色片 | 探花视频在线版播放免费观看 | 国产精品亚州 | 国产成人精品一区二区三区免费 | 日韩在线免费看 | 97福利在线观看 | 欧美极品裸体 | 日韩av电影网站在线观看 | 五月婷婷丁香 | 久草视频手机在线 | 丁香花在线观看免费完整版视频 | 婷婷 综合 色 | 一区二区三区四区精品 | 欧美国产日韩在线观看 | 亚洲激情国产精品 | 一级片视频免费观看 | 国产69精品久久99不卡的观看体验 | av片中文| 免费看国产视频 | 色视频网站免费观看 | 亚洲欧美日韩精品久久奇米一区 | 亚洲欧美日韩一二三区 | 91看片淫黄大片在线播放 | 在线黄色观看 | 精品极品在线 | 成人黄大片视频在线观看 | 亚洲 成人 一区 | 国产不卡网站 | 国产黄色片免费观看 | 亚洲爱爱视频 | 五月天综合网 | 国产精品久久久久毛片大屁完整版 | 精品久久久国产 | 中文字幕在线免费 | 九九一级片 | 狠狠伊人| 亚洲精品免费观看 | 三级在线播放视频 | 特级毛片在线免费观看 | 日韩精品欧美专区 | 天天爱天天色 | 麻豆视频入口 | 欧美一级在线观看视频 | 国产精品正在播放 | 一级片视频免费观看 | 久久国产精品免费一区二区三区 | 91丨九色丨蝌蚪丰满 | 精品国产乱码久久久久久1区2匹 | 黄色毛片在线 | 久久国产网 | 亚洲视频久久 | 久久综合婷婷综合 | 毛片无卡免费无播放器 | 黄av免费| 国产精品视频你懂的 | 最新中文字幕 | 国产精品久久在线 | 精品在线观看一区二区 | 永久免费毛片在线观看 | 亚洲 综合 激情 | 久久xx视频 | 成人性生交大片免费观看网站 | 免费黄色网止 | 成人午夜电影在线 | 99视频久久| 久久成人国产精品 | 五月激情天| 国产精品一区二区免费视频 | 国产精品久久久毛片 | 精品视频www| 天天天操操操 | 国产91亚洲精品 | 麻豆视频入口 | 黄色影院在线播放 | 欧美美女视频在线观看 | 狠狠色丁香久久婷婷综合_中 | 四虎成人免费观看 | 在线观看中文字幕第一页 | 欧美韩国日本在线观看 | 亚洲精品乱码久久久久久9色 | 麻豆传媒视频在线播放 | 波多野结衣在线播放一区 | 日韩视频一二三区 | 久久久久久麻豆 | 在线国产精品一区 | 女人高潮特级毛片 | 亚洲激情在线视频 | 在线精品视频免费播放 | 91av在线视频免费观看 | 亚洲国产经典视频 | 久久一区二区三区国产精品 | 五月婷网站 | 国产女人免费看a级丨片 | 色综合久久66 | 亚洲国产精品电影 | 91热| 亚洲成熟女人毛片在线 | 日韩午夜av | 四虎影视精品永久在线观看 | a视频在线观看 | 天天鲁一鲁摸一摸爽一爽 | 亚洲精品字幕 | 视频一区二区在线观看 | 亚洲四虎在线 | 69国产精品成人在线播放 | 欧美激情视频一区二区三区免费 | 国产一区二区在线免费播放 | 国产美女精品视频 | 91在线网址 | 国产99久久 | 国产一区二区日本 | 欧美国产日韩一区二区三区 | 久久97超碰 | 国产精品久久久久久久久费观看 | 国产剧在线观看片 | 国产不卡一区二区视频 | 日韩在线观看视频中文字幕 | 99国产情侣在线播放 | 天天爱天天 | 中文资源在线观看 | 91完整视频 | 美女视频黄的免费的 | 亚洲一级电影在线观看 | 激情欧美在线观看 | 国产无遮挡猛进猛出免费软件 | 亚洲资源网 | 欧美日韩国产色综合一二三四 | 超碰97中文| 91在线精品视频 | 免费福利在线 | 在线观看午夜av | 成人在线免费小视频 | 最近中文字幕第一页 | 午夜精品久久久 | 亚洲a成人v | 女人18毛片a级毛片一区二区 | 天天操天天谢 | 91av中文字幕 | 一级c片| 久久久久五月天 | 久久久色 | 日韩欧美精品在线观看视频 | 国产一级视频在线观看 | 91热精品| 亚洲成人av一区 | 国产一区二区在线视频观看 | 久久系列| 精品色999 | 亚洲精品中文字幕在线 | 日韩理论电影在线 | 国产精品中文字幕在线播放 | 日日干夜夜骑 | 97超碰在线资源 | 久草视频在线观 | 久久一视频 | 黄色在线免费观看网址 | 免费在线观看黄 | 97视频在线免费观看 | 国产精品嫩草影院9 | 国产黄a三级三级 | 黄色一级性片 | 91日本在线播放 | 夜夜躁狠狠燥 | 欧美一区免费在线观看 | 插综合网 | 精品美女久久久久 | 国产精品a久久 | 91成人欧美 | 亚洲综合精品视频 | 色视频国产直接看 | 亚洲激情在线观看 | 久久国产美女 | 午夜视频免费在线观看 | 免费看一及片 | 综合网av| 黄色av影视 | www.99久久.com | 中文乱幕日产无线码1区 | 深夜福利视频在线观看 | 国产精品久久久久一区二区三区 | 中文字幕在线观看视频一区二区三区 | 中文字幕在线一区二区三区 | 又黄又网站 | 毛片在线网| 久久艹99| 国精产品999国精产品视频 | 中文字幕国内精品 | 亚洲美女精品视频 | 超碰在线cao| 在线观看视频福利 | 亚洲精品久久久蜜臀下载官网 | www.干| 国产中文 | 国产精品毛片一区视频 | 97超碰在线资源 | 国产午夜小视频 | 欧美乱淫视频 | 国产一区成人 | 亚洲aⅴ一区二区三区 | 黄色网址在线播放 | 免费日韩 精品中文字幕视频在线 | 黄色录像av | 夜夜躁狠狠燥 | 久久字幕精品一区 | 丁香六月在线观看 | 天天操天天色综合 | 在线亚洲成人 | 欧美性脚交 | 二区精品视频 | 天天爱天天操天天射 | av在线短片 | 日日麻批40分钟视频免费观看 | 亚洲免费在线 | 麻豆视频免费入口 | 成年人黄色免费视频 | 激情中文字幕 | 在线观看视频精品 | 少妇视频在线播放 | 视频一区二区三区视频 | 午夜国产在线 | 国产一区二区不卡在线 | 欧美日韩视频在线观看免费 | 日韩精品欧美视频 | 婷婷六月色 | 黄色网址中文字幕 | 中文字幕欧美日韩va免费视频 | 五月开心激情 | 午夜在线免费观看视频 | 又色又爽的网站 | 久久免费视频2 | 成人国产精品久久久久久亚洲 | 久保带人 | 美女福利视频一区二区 | 国产黄色免费观看 | 美女网站视频免费都是黄 | 最近高清中文字幕在线国语5 | 国产不卡免费av | 久久天天躁狠狠躁亚洲综合公司 | 区一区二区三在线观看 | 亚洲视频1区2区 | 亚洲一区免费在线 | 福利视频一区二区 | 亚洲成人av影片 | 一二三区视频在线 | 日韩黄色免费在线观看 | 久久久久久久久久电影 | 亚洲国产成人精品在线 | 日韩美女一级片 | 久久毛片网 | 亚洲一级性 | 久久影院午夜论 | 黄色国产精品 | 97网| 亚洲国产一区二区精品专区 | 久久久网站 | 天天插天天操天天干 | 久久99国产精品免费 | 国产99久久精品 | 日韩免费在线观看视频 | 中国一级片免费看 | 综合激情网... | 在线观看亚洲成人 | 99视频免费观看 | 久久99精品波多结衣一区 | 精品伦理一区二区三区 | 一区二区三区电影在线播 | 91九色国产蝌蚪 | 日韩精品极品视频 | 国产视频一区二区三区在线 | 97在线视频免费观看 | 久久视频一区二区 | 91久久国产精品 | 在线直播av | 99中文字幕在线观看 | 中文字幕精品一区久久久久 | 色综合激情久久 | 中文在线a∨在线 | 精品视频资源站 | 亚洲黄色一级电影 | 天天天色综合a | 久久专区| 久久国产电影 | 天堂av影院| av在线电影网站 | 免费视频久久久久久久 | 综合国产在线观看 | 日韩免费电影 | 国产流白浆高潮在线观看 | 欧美疯狂性受xxxxx另类 | 在线观看中文字幕2021 | 一级黄色片在线免费看 | 四虎影视www| 国内精品久久久久 | 国产高清视频在线播放一区 | 中文字幕在 | 特级毛片在线免费观看 | 狠狠网| 国产精品免费麻豆入口 | 欧美久久久久久 | 韩日电影在线观看 | 欧美国产精品久久久久久免费 | www国产亚洲精品久久麻豆 | 99人久久精品视频最新地址 | 欧美经典久久 | 国产自产在线视频 | www.色午夜 | 久久99日韩 | 久久男女视频 | 99精品视频一区二区 | 日日成人网 | 色婷婷九月| 免费观看性生活大片 |