2010-11-19 9 views
11

我創建了具有以下構造onCreateView()在

public CoordinatesPreference(Context context, AttributeSet attrs) 
{ 
    super(context, attrs); 
    setLayoutResource(R.layout.coordinates_preference); 
} 

自定義的偏好定製的偏好被稱爲太頻繁,我也已覆蓋onCreateView()所以它寫入日誌是這樣的:

@Override 
protected View onCreateView(ViewGroup parent) 
{ 
    Log.d("test", "Creating Preference view"); 
    return super.onCreateView(parent); 
} 

和我的日誌充滿了"Creating Preference view"消息,這創造了滾動的遲緩感覺,我相信轉換視圖應該解決這個問題,我看了一下首選項源代碼,如果轉換視圖爲空,則調用onCreateView()

用於測試目的我加入這個方法:

@Override 
public View getView(View convertView, ViewGroup parent) 
{ 
    if (convertView == null) 
    { 
     return super.getView(convertView, parent); 
    } 
    return super.getView(convertView, parent); 
} 

,並設置一個斷點。我發現幾乎總是我的轉換視圖爲空。因此它必須創造一個新的觀點,這是爲什麼?以及如何改善這一點以避免延遲偏好屏幕?

編輯:改變了onCreate被調用的方式,現在它的所有android我只使用setLayoutResource。但這並不能解決問題...

編輯2:我用Debug.StartMethodTracing(),並發現,因爲我懷疑55%的時間花費(當我只是滾動上下)花費的通貨膨脹當convertView爲空時從getView()調用的方法onCreateView()的偏好。

感謝,傑森

+0

你可以粘貼你的喜好看起來像一個截圖嗎? – Macarse 2010-11-30 03:27:11

+0

當然。當我回家後,我會發佈一個 – Jason 2010-11-30 06:19:36

+0

你可以把你的preferences.xml文件?我對此有一個想法,我想確認您的配置與我的一樣。 – ThomasW 2011-05-18 13:27:20

回答

0

我遇到了這個問題,我追蹤到它的佈局設置在preferences.xml文件和我的首選項子類onCreateView()方法。當我從preferences.xml中移除佈局時,onCreateView()停止多次調用。

3

我不知道你有沒有在這個自定義的偏好來實現,但也許超類不知道如何創建自己的喜好適當的看法?

從文檔:

受保護視圖onCreateView(ViewGroup中 親本)

時間: API級別1創建查看來 在此時顯示偏好在 PreferenceActivity。默認 行爲是誇大這種偏好的主要佈局 (見 setLayoutResource(int),如果改變 此行爲,請及時與ID widget_frame指定 ViewGroup中。讓 確保通過調用到 超類的實現。

http://developer.android.com/reference/android/preference/Preference.html

我想你已經設置的水平佈局ID。

現在,我在談論它,WH你不是在佈局中包含這個水平佈局嗎?

+0

謝謝,但我已經在xml中的水平佈局的佈局,和Android確實知道如何膨脹我的喜好(因爲我得到一個工作結果),但它是滯後的滾動,因爲o nCreate()被稱爲如此經常(這是轉換視圖應該解決的問題) – Jason 2010-11-26 08:02:26

0

作爲一個更普遍的答案,而不是具體涉及定製的喜好:

很難看到你發佈的代碼,但如果你需要每次創建一個視圖時間拉的偏好,這將是非常如你所描述的那樣緩慢而遲緩。即使視圖確實存在,您仍然需要設置該值,並且這聽起來像需要來自首選項。 Android偏好讀取速度非常慢,所以如果您想獲得快速體驗,就不能將其與UI創建相關聯。

我想你應該在應用中存儲首選項(可能在Activity中,或者應用子類中並將它們存儲在那裏),以便實現一些簡單的緩存。即您首次需要首選項時,請從應用商店請求,如果不存在,請將其從首選項中提取出來。如果首選項已存儲在活動/應用程序中,請使用該值而不與伸縮設置相關聯。然後,當你寫出prefs時,寫入商店和首選項。通過這樣做,getView()需要創建新視圖的頻率並不重要,因爲首選項可以使用活動/應用程序對象中的副本快速訪問,但也會持久存儲在未來的首選項中。

我不知道偏好框架是否在某處存在緩存,但我加載prefs的經驗是,如果少數需要加載用戶會注意到滯後,所以緩存是必不可少的。

+0

首選項是本地緩存,不會對共享首選項進行冗餘讀寫。 – Jason 2010-12-05 05:57:07

1

我不確定您使用的代碼是否是準確的測試。我有一個自定義首選項,我只重寫5個方法,其中三個是構造函數。

public ImageButtonPreference(Context context) 
{ 
    this(context, null); 
} 

public ImageButtonPreference(Context context, AttributeSet attrs) 
{ 
    this(context, attrs, 0); 
} 

public ImageButtonPreference(Context context, AttributeSet attrs, int defStyle) 
{ 
    super(context, attrs, defStyle); 
    mInflater = LayoutInflater.from(context); 

    // This is where I pull all of the styleable info from the attrs 
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ImageButtonPreference, defStyle, 0); 
    for(int i = a.getIndexCount(); i >= 0; i--) 
    { 
     int attr = a.getIndex(i); 
     switch (attr) 
     { 
     case R.styleable.ImageButtonPreference_logo: 
      mImageResource = a.getResourceId(attr, mImageResource); 
      break; 
     case R.styleable.ImageButtonPreference_button_text: 
      mButtonText = a.getString(attr); 
      break; 
     } 
    } 
} 

@Override 
protected View onCreateView(ViewGroup parent) 
{ 
    View view = mInflater.inflate(R.layout.image_button_preference, parent, false); 
    return view; 
} 

@Override 
protected void onBindView(View view) 
{ 
    super.onBindView(view); 

    ImageView image = (ImageView)view.findViewById(R.id.Logo); 
    if(image != null && mImageResource != 0) image.setImageResource(mImageResource); 

    Button button = (Button)view.findViewById(R.id.ConnectButton); 
    if(button != null) 
    { 
     button.setText(mButtonText); 
     button.setOnClickListener(mButtonListener); 
    } 
} 

我從Android源拉到這個代碼,幾乎一字不差,所以它應該是一樣快,因爲其他任何偏好。

+0

是的,我的代碼非常相似。 – Jason 2010-12-03 15:04:02

相關問題