2

Here is a similar question but assumes the use of PreferenceActivity.

However, how to make a preference long-clickable when there is no PreferenceActivity, for example when using a PreferenceFragment?

PreferenceFragment does not provide a reference to ListView (getListView() is hidden from the API), so the same approach is not possible.

Community
  • 1
  • 1
Mark
  • 7,446
  • 5
  • 55
  • 75

2 Answers2

2
class LongClickablePreference(context: Context, attrs: AttributeSet?) : Preference(context, attrs) {
    /**
     * @return true if the long-click was handled
     */
    var onPreferenceLongClickListener: ((Preference) -> Boolean)? = null

    override fun onBindViewHolder(holder: PreferenceViewHolder) {
        super.onBindViewHolder(holder)
        holder.itemView.setOnLongClickListener {
            performLongClick()
        }
    }

    private fun performLongClick(): Boolean {
        if (!isEnabled || !isSelectable) {
            return false
        }
        return onPreferenceLongClickListener?.invoke(this) ?: false
    }
}

A similar approach can be taken for other Preference types.

Mark
  • 7,446
  • 5
  • 55
  • 75
0

All the answers I found on SO like these above are now obsolete as they deal with preference screen based on ListView whereas AppCmpat and androidx use RecyclerView. In such case one can do the following: 1. Extend preference class 2. Override onBindViewHolder 3. define some interface for outer fragment/activity and invoke interface method in Holder.View.OnLongClickListener

private static class OrgPreference extends SwitchPreference
    {
        private final OnEntryClickListener mOnEntryClickListener;

        public OrgPreference(Context context, OnEntryClickListener onEntryClickListener) {
            super(context);
            mOnEntryClickListener = onEntryClickListener;
        }

        @Override
        public void onBindViewHolder(PreferenceViewHolder holder) {
            super.onBindViewHolder(holder);

            holder.itemView.setOnLongClickListener(view -> {
                String companyId = OrgPreference.this.getKey();
                mOnEntryClickListener.onEntryLongClick(companyId);
                return true;
            });
        }
    }

In fragment/activity:

interface OnEntryClickListener {
        void onEntryLongClick(String companyId);
    }

...

OrgPreference switchPreference = new OrgPreference(getContext(), new OnEntryClickListener() {
            @Override
            public void onEntryLongClick(String companyId) {
                //Do stuff
            }
        });
RoK
  • 960
  • 1
  • 7
  • 6