Определение длинного нажатия в XML-макете, например, android: onClick делает

Есть какой-либо способ определить в XML-макет longKeyLongPress определение, например onClick.

Т.е. это мой взгляд

<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:text="Line 1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/message" android:textSize="15dip" android:textStyle="bold" android:textColor="@color/colorblue" android:shadowDy="1.0" android:shadowDx="1.0" android:shadowRadius="1.0" android:shadowColor="#ffffffff" android:paddingLeft="10dip" android:paddingRight="10dip" android:paddingTop="5dip" android:lineSpacingExtra="3dip" android:lineSpacingMultiplier="1.1" android:singleLine="false" android:autoLink="web|email|phone|map|all" android:onClick="clickHandler" android:clickable="true" /> 

Я хочу что-то вроде раньше, но реагирую на событие longpress.

Заметка:

  • Я не хочу добавлять слушателя из своего кода.

  • Я пробовал с android: longClickable.

Solutions Collecting From Web of "Определение длинного нажатия в XML-макете, например, android: onClick делает"

Рассматривая текущую документацию, такой параметр XML в настоящее время не существует. LongClickable является логическим параметром, чтобы определить, реагирует ли вид на длинные клики или нет.

Атрибут не определен, однако его можно реализовать.

  1. Расширьте TextView и назовем его MyTextView .
  2. Затем добавьте файл attrs.xml в res / values ​​/ со следующим содержимым:

     <xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyTextView"> <attr name="onKeyLongPress" format="string"/> </declare-styleable> </resources> 
  3. В конструкторе MyTextView добавьте логику для чтения данных из xml:

     public MyTextView(final Context context, final AttributeSet attrs, final int defStyle) { super(context, attrs, defStyle); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyTextView); final int N = a.getIndexCount(); for (int i = 0; i < N; ++i) { int attr = a.getIndex(i); switch (attr) { case R.styleable.MyTextView_onKeyLongPress: { if (context.isRestricted()) { throw new IllegalStateException("The "+getClass().getCanonicalName()+":onKeyLongPress attribute cannot " + "be used within a restricted context"); } final String handlerName = a.getString(attr); if (handlerName != null) { setOnLongClickListener(new OnLongClickListener() { private Method mHandler; @Override public boolean onLongClick(final View p_v) { boolean result = false; if (mHandler == null) { try { mHandler = getContext().getClass().getMethod(handlerName, View.class); } catch (NoSuchMethodException e) { int id = getId(); String idText = id == NO_ID ? "" : " with id '" + getContext().getResources().getResourceEntryName( id) + "'"; throw new IllegalStateException("Could not find a method " + handlerName + "(View) in the activity " + getContext().getClass() + " for onKeyLongPress handler" + " on view " + MyTextView.this.getClass() + idText, e); } } try { mHandler.invoke(getContext(), MyTextView.this); result = true; } catch (IllegalAccessException e) { throw new IllegalStateException("Could not execute non " + "public method of the activity", e); } catch (InvocationTargetException e) { throw new IllegalStateException("Could not execute " + "method of the activity", e); } return result; } }); } break; } default: break; } } a.recycle(); } 
  4. Используйте новый атрибут в вашем макете xml:

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res/**your.package**" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <your.package.MyTextView android:id="@+id/theId" android:layout_width="wrap_content" android:layout_height="wrap_content" custom:onKeyLongPress="myDoSomething" /> <!-- Other stuff --> </LinearLayout> 

Кредиты: