8 votes

Comment gérer la disposition des préférences personnalisées

J'ai une préférence personnalisée avec une image et deux textes et je dois changer l'image de manière programmatique.

Je suis capable d'obtenir la vue des préférences personnalisées et de trouver l'ImageView dans la mise en page en utilisant findViewById, mais si j'essaie de changer l'image, cela ne fonctionne pas.

Est-ce que je me trompe ?

SCHÉMA DE PRÉFÉRENCES

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/imageforfacebook"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:padding="5dip"
        android:src="@drawable/icon" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <TextView
            android:id="@+android:id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:fadingEdge="horizontal"
            android:singleLine="true"
            android:text="titolo"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:textSize="18sp" />

        <TextView
            android:id="@+android:id/summary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@android:id/title"
            android:layout_below="@android:id/title"
            android:maxLines="2"
            android:text="descrizione"
            android:textAppearance="?android:attr/textAppearanceSmall" />
    </LinearLayout>

</LinearLayout>

CODE POUR CHANGER LE CONTENU DE L'IMAGEVIEW

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

View v = (View) prefs_facebookimage.getView(null, null);
ImageView img = (ImageView) v.findViewById(R.id.imageforfacebook);
Uri uri = Uri.parse(path);
img.setImageURI(uri);

12voto

alex_yh99 Points 96

J'ai essayé getView mais cela ne fonctionne pas pour moi, j'ai finalement réussi à le faire avec une routine personnalisée. Preference :

public class ImageViewPreference extends Preference {
    private ImageView mImageView;
    private Bitmap mPhoto;

    public ImageViewPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.setWidgetLayoutResource(R.layout.pref_account_image);
        if (mPhoto == null) {
            mPhoto = BitmapFactory.decodeResource(
                    getContext().getResources(), R.drawable.icon);
        }
    }

    @Override
    protected void onBindView(View view) {
        super.onBindView(view);
        mImage = (ImageView) view.findViewById(R.id.pref_imageView);
        mImage.setImageBitmap(mPhoto);
    }

    public void setImage(Intent imageData) {
        mPhoto = data.getParcelableExtra("data");
    }
}

Et voici le Preference.xml :

<PreferenceCategory
    android:key="@string/pref_category_myNote_key"
    android:title="@string/pref_category_myNote" >
    <com.flounder.xeniaNote.view.ImageViewPreference
        android:key="@string/pref_image_key"
        android:title="@string/pref_image"
        android:widgetLayout="@layout/pref_account_image" />
</PreferenceCategory>

Et appelez mImagePref.setImage pour changer votre ImageView dans la méthode de rappel onPreferenceClick .

J'espère que ça aidera ! Bonne chance.

0voto

ali.chousein Points 95

Que se passe-t-il si vous placez toutes les images sous res/drawable et que vous y accédez par R.drawable. ? Cette approche a toujours fonctionné pour moi. Si vous n'avez pas de raisons impérieuses d'utiliser les URI, cette approche peut valoir la peine d'être essayée. Même si vous devez utiliser URI, je vous suggère de tester cette approche et de la faire fonctionner. Ainsi, vous saurez au moins qu'il y a un problème avec la valeur du "path" et non avec votre implémentation en général.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X