2011-11-15 15 views
7

¿es posible acceder mediante programación a un diseño que se establece en una preferencia?Establecer el diseño de preferencias y cambiar el atributo en él

Aquí es lo que tengo, un proyecto muy simple - prueba de concepto

La actividad Preferencia:

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

    } 
} 

El XML de recursos:

<?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> 

El diseño personalizado para la preferencia :

<?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> 

Lo que quiero es poder acceder al ImageView "iconka" desde la Actividad y cambiar la imagen desde allí. Estoy usando API 8 (Android 2.2)

Actualmente la "v" es nula y no tengo ni idea de por qué es eso.

¡Una sugerencia será muy apreciada!

Actualización - La Solución: En realidad, necesitaba una preferencia costumbre que puedo modificar para mis necesidades. Esta es una guía práctica sobre cómo crear su propia preferencia personalizada en su proyecto: Android & Amir - Android Preferences Vea la parte cuando el autor crea una clase de preferencia personalizada.

+0

esto no es válido para Honeycomb y superior, coz PreferenceFragment entra en la escena – gaara87

Respuesta

1

Trate de tomar un vistazo a los siguientes debates sobre imageview. Podría ayudarte con tu problema.

Android: findViewById of an ImageView (custom adapter)

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

+0

Estoy aceptando su respuesta, pero no resuelve mi problema. Me di cuenta de que necesitaba de alguna manera obtener o extender el ListAdapter de la actividad de preferencia para alcanzar la vista del nodo :(Aunque sigo pensando que getView() de la preferencia podría hacer el trabajo. Solo necesito averiguar cuál es el parámetro padre –

+0

Creo que necesita pasar el ViewGroup padre como el segundo parámetro. @Override public Ver getView (Ver convertView, ViewGroup principal) { convertView = this.layout == null? onCreateView (principal): this.layout; devolver convertView; } – Bryan

+0

Obtuve ese ejemplo en la siguiente URL, en los comentarios del blog. http://android-journey.blogspot.com/2010/01/for-almost-any-application-we-need-to.html – Bryan

1

tratar getLayoutResource para obtener el View de la preferencia y luego obtener su ImageView

+1

este método devuelve un int (recursos) y no es útil. Creo que necesito usar .getView(), pero no puedo entender qué debería pasar como segundo parámetro. Si paso this.getListView() no me devuelve la vista correcta. –

8

Después de 20 min de tirar del pelo encontré una solución elegante a este problema. Primero, amplíe la preferencia y luego anule el método getView (Ver convertView, ViewGroup primario). Mi caso era este: tenía un diseño de preferencias con el icono de la aplicación y 2 vistas de texto (nombre y versión de la aplicación). Quiero cambiar la versión de la aplicación programáticamente. ¿Cómo hago esto? sólo echar un vistazo a continuación:

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 solución es la siguiente: View v = super.getView(convertView, parent); al redefinir el método getView. La llamada a super.getview devolverá la vista de diseño.

Y mi preferencia XML se parece a:

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

¡Esto fue genio! ¡Gracias! – Nick

+0

@Alexandru Me salvaste un dolor de cabeza creciente. Gracias hombre. –

+0

¿Qué es el convertView y el padre? – bgenchel

Cuestiones relacionadas