2010-11-19 8 views
11

ich eine benutzerdefinierte Einstellung erstellt haben, die den folgenden KonstruktoronCreateView() wird zu oft in den kundenspezifischen Vorlieben genannt

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

hat Und ich habe außer Kraft gesetzt onCreateView() so schreibt es in das Protokoll wie folgt aus:

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

und mein Protokoll ist voll von "Creating Preference view" Nachrichten, das schafft ein Laggy-Gefühl zu scrollen und ich glaube, Konvertierungsansicht soll das lösen, ich hatte einen Blick auf die Präferenz-Quellcode und wenn konvertieren Ansicht ist null dann onCreateView() heißt.

zu Testzwecken habe ich diese Methode:

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

und einen Haltepunkt gesetzt. Ich habe festgestellt, dass meine Convert-Ansicht fast immer null ist. und deshalb muss es eine neue Sichtweise schaffen, warum ist das so? und wie kann ich dies verbessern, um einen verzögerten Einstellungsbildschirm zu vermeiden?

EDIT: Changed die Art und Weise der OnCreate aufgerufen wird, jetzt ist alles android Ich verwende einfach setLayoutResource. aber das löst das Problem nicht ...

EDIT2: Ich habe Debug.StartMethodTracing() benutzt und habe festgestellt wie ich vermutet, dass 55% der Zeit (wenn ich gerade auf und ab blättere) auf die Inflation von ausgeben werden die Präferenz von der Methode onCreateView(), die von getView() aufgerufen wird, wenn convertView null ist.

Danke, Jason

+0

Können Sie einen Screenshot einfügen, wie Ihre Einstellungen aussehen? – Macarse

+0

Sicher. Ich poste eins wenn ich nach Hause komme – Jason

+0

Kannst du deine preferences.xml Datei aufhängen? Ich habe eine Idee und ich möchte bestätigen, dass Ihre Konfiguration wie meine ist. – ThomasW

Antwort

0

Ich stieß auf dieses Problem und ich verfolgt es auf die Tatsache, dass ich das Layout sowohl in der preferences.xml-Datei und in meiner Preference-Unterklasse OnCreateView() -Methode festgelegt hatte. Als ich das Layout von preferences.xml entfernte, wurde onCreateView() nicht mehr mehrmals aufgerufen.

3

Ich weiß nicht, was Sie in diesen kundenspezifischen Vorlieben umgesetzt haben, aber vielleicht die Superklasse nicht weiß, wie man eine richtige Ansicht nach Ihren Wünschen erstellen?

Aus der Dokumentation:

geschützt Ansicht onCreateView (Viewgroup Eltern)

seit: API Ebene 1 Erstellt die Ansicht auf für diese Bevorzugung im PreferenceActivity angezeigt. Der Standard Verhalten ist das Hauptlayout dieser Preference aufzublasen (siehe setLayoutResource (int). Beim Wechsel dieses Verhalten, geben Sie bitte eine Viewgroup mit ID widget_frame. Machen sicher auf die Super Implementierung rufen durch.

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

ich denke, Sie haben gezeigt, dass ID auf dem horizontalen Layout gesetzt.

Jetzt, wo ich darüber zu reden, wh Nehmen Sie dieses horizontale Layout nicht in das Layout, das Sie aufblasen?

+0

Danke, aber ich habe bereits das Layout in der horizontalen Layout in der XML, und Android weiß, wie ich meine Präferenz aufblasen (wie ich ein Arbeitsergebnis bekomme) aber es ist Laggy zu scrollen, weil o nCreate() heißt so oft (dies ist, was convert view lösen soll) – Jason

0

Als eine allgemeine Antwort, beziehen sich nicht speziell auf individuelle Vorlieben:

Es ist schwer, mit dem Code, den Sie geschrieben, aber wenn Ihre Bedürfnisse zu sehen, eine Präferenz jedes Mal, wenn eine Ansicht erstellt zu ziehen, wird es sehr sein langsam und laggy wie du es beschreibst.Selbst wenn die Ansicht vorhanden ist, müssen Sie den Wert noch festlegen, und es klingt so, als müsste dies von der Präferenz kommen. Android Preference Reads sind unglaublich langsam, daher können sie nicht mit der Erstellung von UI verknüpft werden, wenn Sie eine gute schnelle Erfahrung wünschen.

Ich denke, Sie sollten die Einstellungen in der App speichern (vielleicht in der Aktivität oder Unterklasse der Anwendung und speichern Sie sie dort), um einige einfache Zwischenspeicherung zu implementieren. Wenn Sie zum ersten Mal eine Einstellung benötigen, fordern Sie sie im App Store Ihrer App an. Wenn sie nicht vorhanden ist, entfernen Sie sie aus den Einstellungen. Wenn die Präferenz bereits in der Aktivität/Anwendung gespeichert ist, verwenden Sie diesen Wert, ohne die Einstellungen aufzurufen. Dann, wenn Sie die Einstellungen schreiben, schreiben Sie in den Laden und die Präferenz. Dabei spielt es keine Rolle, wie oft getView() neue Sichten erstellen muss, da auf die Präferenz mit der Kopie im Aktivitäts-/Anwendungsobjekt schnell zugegriffen werden kann, aber auch dauerhaft in den Voreinstellungen für die Zukunft gespeichert wird.

Ich weiß nicht, ob das Preferences-Framework etwas Caching irgendwo hat, aber meine Erfahrung mit dem Laden von Prefs ist, dass, wenn einige laden müssen, der Benutzer eine Verzögerung bemerken wird, also ist Caching essentiell.

+0

Die Präferenz wird lokal zwischengespeichert, kein redundantes Lesen und Schreiben in oder aus den gemeinsamen Einstellungen. – Jason

1

Ich bin mir nicht sicher, ob der Code, den Sie verwenden, ein genauer Test ist. Ich habe eine benutzerdefinierte Einstellung und ich überschreibe nur 5 Methoden und drei davon sind Konstruktoren.

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); 
    } 
} 

Ich habe diesen Code gezogen, fast wörtlich aus dem Android Quelle, so dass es nur so schnell wie jede andere Präferenz sein sollte.

+0

Ja, mein Code ist dem sehr ähnlich. – Jason

Verwandte Themen