Подтвердить что ты не робот

Определение длинного нажатия в формате 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.

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

    public MyTextView(final Context context, final AttributeSet attrs) {
    super(context, attrs);
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyTextView);
    
    for (int i = 0; i < a.getIndexCount(); ++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();
    
    }
    
  • Используйте новый атрибут в макете xml:

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:custom="http://schemas.android.com/apk/res/res-auto"
        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>
    

Credits: