2011-11-15 16 views
7

Czy jest możliwe uzyskanie programowego dostępu do układu, który jest ustawiony na Preferencję?Ustawianie układu preferencji i zmiana w nim atrybutu

Oto co mam, bardzo prosty projekt - dowód koncepcji

Activity Pierwszeństwo:

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

    } 
} 

XML zasobu:

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

Układ niestandardowy dla preferencji :

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

Czego chcę, to móc uzyskać dostęp do obrazu "Iconka" z Aktywności i zmienić z tego miejsca obraz. Używam API 8 (Android 2.2)

Obecnie "v" jest zerowe i nie mam pojęcia, dlaczego tak jest.

Wskazówka jest bardzo cenna!

Aktualizacja - Rozwiązanie: Właściwie potrzebowałem niestandardowej preferencji, którą mogę zmodyfikować zgodnie z moimi potrzebami. Ten jest praktycznym przewodnikiem, jak utworzyć własne niestandardowe preferencje w projekcie: Android & Amir - Android Preferences Zobacz część, w której autor tworzy niestandardową klasę preferencji.

+0

to nie jest ważne dla miodu powyżej, coz PreferenceFragment przychodzi na scenie – gaara87

Odpowiedz

1

Spróbuj przyjrzeniu następujących dyskusji na ImageView. Może ci pomóc w rozwiązaniu problemu.

Android: findViewById of an ImageView (custom adapter)

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

+0

Akceptuję twoją odpowiedź, ale to nie rozwiązuje mojego problemu. Zdałem sobie sprawę, że potrzebuję jakoś uzyskać lub rozszerzyć ListAdapter z PreferenceActivity w celu osiągnięcia widoku węzła :(Chociaż nadal myślę, że getView() z preferencji może wykonać zadanie. Po prostu muszę dowiedzieć się, który jest parametr nadrzędny. –

+0

Myślę, że musisz przekazać nadrzędną grupę ViewGroup jako drugi parametr. @Override public Zobacz getView (Zobacz convertView, ViewGroup parent) { convertView = this.layout == null? onCreateView (rodzic): this.layout; return convertView; } – Bryan

+0

Mam ten przykład pod następującym adresem URL, w komentarzach na blogu. http://android-journey.blogspot.com/2010/01/for-almost-any-application-we-need-to.html – Bryan

1

spróbować getLayoutResource uzyskać View z preferencjami, a następnie dostać swoje ImageView

+1

metoda ta zwraca int (resource) i to nie jest użyteczne. Uważam, że muszę użyć funkcji .getView(), ale nie wiem, co powinienem podać jako drugi parametr. Jeśli przekażę this.getListView(), nie zwrócę mi poprawnego widoku. –

8

Po 20 minutach włosy ciągnięcie I znaleziono eleganckie rozwiązanie tego problemu. Najpierw rozszerz preferencję, a następnie zastąp metodę getView (Zobacz convertView, ViewGroup parent). Mój przypadek był następujący: miałem układ preferencji z ikoną aplikacji i 2 widokami tekstowymi (nazwa i wersja aplikacji). Chcę programowo zmienić wersję aplikacji. Jak mam to zrobic? wystarczy spojrzeć poniżej:

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


} 

Rozwiązanie to: View v = super.getView(convertView, parent); gdy przesłanianie metody getView. Wywołanie super.getview spowoduje powrót do widoku układu.

A moja preferencja xml wygląda następująco:

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

To był genialny! Dzięki! – Nick

+0

@Alexandru Uratowałeś mi rosnący ból głowy. Dzięki. –

+0

Co to jest convertView i rodzic? – bgenchel