2011-11-15 2 views
7

est-il possible d'accéder par programmation à une mise en page définie sur une préférence?Définition de la disposition des préférences et modification de l'attribut

Voici ce que j'ai, un projet très simple - preuve de concept

L'activité de préférence:

package com.example; 

import android.os.Bundle; 
import android.preference.PreferenceActivity; 
import android.util.Log; 
import android.view.View; 

public class PreferenceExampleActivity extends PreferenceActivity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 

     ImageView v = (ImageView) findViewById(R.id.iconka); 

    } 
} 

Le XML des ressources:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:key="settings"> 
    <PreferenceCategory 
     android:title="Category Setting Name" 
     android:order="1" 
     android:key="Main"> 
     <Preference 
      android:order="1" 
      android:title="Setting" 
      android:summary="Setting1" 
      android:layout="@layout/profile_preference_row" 
      android:key="profile" /> 
    </PreferenceCategory> 
</PreferenceScreen> 

La mise en page personnalisée pour la préférence :

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/widget_frame" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:minHeight="?android:attr/listPreferredItemHeight" 
    android:gravity="center_vertical" 
    android:paddingRight="?android:attr/scrollbarSize"> 



    <RelativeLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="15dip" 
     android:layout_marginRight="6dip" 
     android:layout_marginTop="6dip" 
     android:layout_marginBottom="6dip" 
     android:layout_weight="1"> 

     <TextView android:id="@+android:id/title" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:singleLine="true" 
      android:textAppearance="?android:attr/textAppearanceLarge" 
      android:ellipsize="marquee" 
      android:fadingEdge="horizontal" /> 

     <TextView android:id="@+android:id/summary" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@android:id/title" 
      android:layout_alignLeft="@android:id/title" 
      android:textAppearance="?android:attr/textAppearanceSmall" 
      android:textColor="?android:attr/textColorSecondary" 
      android:maxLines="4" /> 

    </RelativeLayout> 
    <ImageView 
     android:id="@+id/iconka" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     /> 
</LinearLayout> 

Ce que je veux, c'est pouvoir accéder à l'ImageView "iconka" de l'Activité et changer l'image à partir de là. J'utilise API 8 (Android 2.2)

Actuellement, le "v" est nul et je ne sais pas pourquoi.

Un indice sera très apprécié!

Mise à jour - La solution: En fait, j'avais besoin d'une préférence personnalisée que je peux modifier selon mes besoins. Celui-ci est un guide pratique pour créer votre propre préférence personnalisée dans votre projet: Android & Amir - Android Preferences Voir la partie lorsque l'auteur crée une classe de préférences personnalisées.

+0

ce n'est pas valable pour HONEYCOMB et plus, coz PreferenceFragment vient dans la scène – gaara87

Répondre

1

Essayez de jeter un oeil sur les discussions qui ont suivi sur imageview. Pourrait vous aider avec votre problème.

Android: findViewById of an ImageView (custom adapter)

Android : getting NullPointerException for ImageView imag = (ImageView) findViewById(R.id.image)

+0

J'accepte votre réponse, mais cela ne résout pas mon problème. J'ai réalisé que j'avais besoin d'obtenir ou d'étendre le ListAdapter de PreferenceActivity pour atteindre la vue du nœud :(Bien que je pense toujours que getView() de la préférence pourrait faire le travail. le paramètre parent. –

+0

Je pense que vous devez passer le parent ViewGroup comme second paramètre. @Override public View getView (Voir convertView, parent ViewGroup) { convertView = this.layout == null? onCreateView (parent): this.layout; return convertView; } – Bryan

+0

J'ai eu cet exemple à l'URL suivante, dans les commentaires du blog. http://android-journey.blogspot.com/2010/01/for-almost-any-application-we-need-to.html – Bryan

1

essayer getLayoutResource pour obtenir le View de la préférence et obtenir votre ImageView

+1

cette méthode renvoie un int (ressources) et il est pas utile. Je crois que j'ai besoin d'utiliser .getView(), mais je ne peux pas comprendre ce que je devrais passer en second paramètre. Si je passe this.getListView() ne me renvoie pas la vue correcte. –

8

Après 20 min de tirer les cheveux, j'ai trouvé une solution élégante à ce problème. Tout d'abord, étendez la préférence, puis remplacez la méthode getView (View convertView, ViewGroup parent). Mon cas était le suivant: j'avais une disposition de préférence avec l'icône de l'application et 2 affichages de texte (nom de l'application et version). Je veux changer la version de l'application par programme. Comment puis-je faire cela? il suffit de regarder ci-dessous:

public class AboutUsPreference extends Preference { 

    public AboutUsPreference(Context context) { 
     super(context); 
    } 

    public AboutUsPreference(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public AboutUsPreference(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public View getView(View convertView, ViewGroup parent) { 
     View v = super.getView(convertView, parent); 
     ((TextView)v.findViewById(R.id.textView2)).setText(getAppVersion());   
     return v; 
    } 

    private String getAppVersion(){ 
     PackageInfo pInfo = null; 
     try { 
      pInfo = getContext().getPackageManager().getPackageInfo(getContext().getPackageName(), 0); 
     } catch (NameNotFoundException e) { 
      Log.e(getClass().getName(), e.getMessage(), e); 
      return ""; 
     } 

     String version = pInfo.versionName; 
     return getContext().getString(R.string.version, version); 
    } 


} 

La solution est la suivante: View v = super.getView(convertView, parent); lors de la substitution méthode getView. L'appel super.getview renverra votre vue de disposition.

Et ma préférence xml ressemble:

<com.audioRec.android.settings.aboutUs.AboutUsPreference 
     android:layout="@layout/about_preference_layout"/> 
+0

C'était génial! Merci! – Nick

+0

@Alexandru Vous m'avez sauvé un mal de tête. Merci mec. –

+0

Qu'est-ce que convertView et le parent? – bgenchel

Questions connexes