2016-05-30 13 views
1

TextEditPreferencesなどを含むPreferenceFragmentがあり、デフォルトのImageViewの代わりにVolley NetworkImageViewを使用してこのカスタム設定を使用しています。終わり。それ以外の場合は、layout-wiseでcompat-v14 preferences.xmlファイルからコピー貼り付けされます。カスタムレイアウトにフォーカスまたはクリックイベントがありません

問題は、カスタムプリファレンス項目に触れるときにフォーカス、選択、またはクリックイベントが発生しないことです。私は私が作ってみたすべてのものしようとしました:のonClickを()、onPreferenceTreeClick()、setOnPreferenceClickListener、レイアウトXML android:selectable="true"android:enabled="true"android:descendantFocusability="blocksDescendants" ...

XML /あるpreferences.xml

<PreferenceCategory android:title="Icon"> 
    <dev.niko.project.views.GravatarIconPreference android:key="auth.user.avatar" 
     android:title="Gravatar" android:summary="This has no focus animation, no click events are fired and certainly no Intent" 
     android:selectable="true" android:enabled="true" 
     android:layout="@layout/preference_gravatar" 
     android:defaultValue=""> 
     <intent android:action="android.intent.action.VIEW" android:data="https://en.gravatar.com/connect/" /> 
    </dev.niko.project.views.GravatarIconPreference> 
    <Preference 
     android:title="Gravatar" android:summary="This works fine"> 
     <intent android:action="android.intent.action.VIEW" android:data="https://en.gravatar.com/connect/" /> 
    </Preference> 
</PreferenceCategory> 

MyPreferencesFragmentを設定します。 Javaの

public class AccountSettingsFragment extends PreferenceFragment 
    implements SharedPreferences.OnSharedPreferenceChangeListener { 
@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    addPreferencesFromResource(R.xml.preferences); 

    preferences = context.getSharedPreferences(PREF_NAME_AUTH, Context.MODE_PRIVATE); 

    GravatarIconPreference gravatarIconPref = ((GravatarIconPreference)findPreference(AVATAR)); 
    gravatarIconPref.setImageUrl(API.gravatar(preferences.getString(EMAIL, null))); 
    gravatarIconPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 
     @Override 
     public boolean onPreferenceClick(Preference preference) { 
      Log.wtf(TAG, "gravatarIconPref.onPreferenceClick()"); 
      return false; 
     } 
    }); 

    for (String key : preferences.getAll().keySet()) { 
     onSharedPreferenceChanged(preferences, key); 
    } 

} 

@Override 
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 
    Log.wtf(TAG, "onPreferenceTreeClick(..., "+preference.getKey()+")"); 
    return super.onPreferenceTreeClick(preferenceScreen, preference); 
} 

@Override 
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, final String key) { 

    final Preference preference = findPreference(key); 

    if (preference != null) { 
     Log.d(TAG, "onSharedPreferenceChanged. key="+key+" preference.getKey="+preference.getKey()); 
    } 
} 
} 

GravatarIconPreference.java

public class GravatarIconPreference extends Preference { 

private static final String TAG = GravatarIconPreference.class.getSimpleName(); 

private Context context; 
private View view; 
private Drawable icon; 

private String url; 

public GravatarIconPreference(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    setSelectable(true); 
    setEnabled(true); 
    this.context = context; 
} 

// also tried overriding onCreateView, no change 

@Override 
protected void onBindView(View view) { 

    super.onBindView(view); 

    view.setClickable(true); 

    if (view != null && !TextUtils.isEmpty(url)) { 
     NetworkImageView gravatar = ((NetworkImageView) view.findViewById(R.id.gravatar)); 
     if (gravatar != null) { 
      gravatar.setImageUrl(url, App.getInstance().getImageLoader()); 
     } 
    } 

} 

@Override 
protected void onClick() { 

    Log.wtf(TAG, "onClick()!!!"); 
    super.onClick(); 

} 

@Override 
public Drawable getIcon() { 
    // TODO: gravatar-networkimageview 
    return super.getIcon(); 
} 

public void setImageUrl(@Nullable String url) { this.url = url; } 

} 
カスタム好みのために

preference_gravatar.xml source

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:minHeight="?android:attr/listPreferredItemHeightSmall" 
       android:gravity="center_vertical" 
       android:paddingStart="?android:attr/listPreferredItemPaddingStart" 
       android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" 
       android:background="?android:attr/activatedBackgroundIndicator" 
       android:clipToPadding="false" 
       android:focusable="true" android:descendantFocusability="blocksDescendants" 
       android:baselineAligned="false"> 

    <LinearLayout android:id="@+id/icon_frame" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginStart="-4dp" 
     android:minWidth="60dp" 
     android:gravity="start|center_vertical" 
     android:orientation="horizontal" 
     android:paddingEnd="12dp" 
     android:paddingTop="4dp" 
     android:paddingBottom="4dp" android:focusable="false"> 
     <com.android.volley.toolbox.NetworkImageView android:id="@+id/gravatar" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      app:maxWidth="48dp" 
      app:maxHeight="48dp" 
      android:layout_marginStart="@dimen/list_icon_margin" 
      android:layout_gravity="center" /> 
    </LinearLayout> 

    <RelativeLayout 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:paddingTop="16dp" 
     android:paddingBottom="16dp"> 
     <TextView android:id="@android:id/title" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:singleLine="true" 
        android:textAppearance="?android:attr/textAppearanceListItem" 
        android:ellipsize="marquee" 
        android:layout_alignParentStart="true" 
        android:layout_toStartOf="@+id/chevron"/> 
     <TextView android:id="@android:id/summary" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_below="@android:id/title" 
        android:textAppearance="?android:attr/textAppearanceSmall" 
        android:textColor="?android:attr/textColorSecondary" 
        android:maxLines="10" 
        android:layout_alignParentStart="true" 
        android:layout_toStartOf="@+id/chevron"/> 

     <ImageView android:id="@+id/chevron" 
        android:src="@mipmap/ic_chevron_right_black_48dp" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_centerVertical="true" 
        android:layout_alignParentEnd="true" 
        android:alpha="0.5" 
        android:contentDescription="go to url" /> 

    </RelativeLayout> 

    <!-- Preference should place its actual preference widget here. --> 
    <LinearLayout android:id="@android:id/widget_frame" 
        android:layout_width="wrap_content" 
        android:layout_height="match_parent" 
        android:gravity="end|center_vertical" 
        android:paddingStart="16dp" 
        android:orientation="vertical" /> 

</LinearLayout> 
+0

適切なチュートリアルを上から撮ることは私のために問題を修正しているようです:代わりに 'onCreateViewを(オーバーライドの )' 'ちょうどsetLayoutResource(と呼ばれている)'コンストラクタで。 – user3187600

答えて

0

、あなたはプログラムでクリックリスナーを設定する必要があります。

@Override 
protected void onBindView(View view) { 

    super.onBindView(view); 

    view.setClickable(true); 

    if (view != null && !TextUtils.isEmpty(url)) { 
     NetworkImageView gravatar = ((NetworkImageView) view.findViewById(R.id.gravatar)); 
     if (gravatar != null) { 
      gravatar.setImageUrl(url, App.getInstance().getImageLoader()); 
      gravatar.setOnClickListener(new OnClickListener() {  
       @Override 
       public void onClick(View v) { 
        Log.i("test","clicked"); 
       } 
      } 
     } 
    } 
} 
関連する問題