Пользовательский вид Android должен расширять представление AppCompatTextView

#android

Вопрос:

Я создал простой пользовательский вид , который был расширен TextView , в Android Studio я получаю этот wanrning

 This custom view should extend android.support.v7.widget.AppCompatTextView instead
 

и я не могу использовать clickable правильную практику, например:

    <com.myapp.test.Widgets.FontAwesome
       android:layout_width="60dp"
       android:layout_height="match_parent"
       android:layout_marginRight="5dp"
       android:background="?selectableItemBackground"
       android:gravity="center"
       android:clickable="@{()->presenter.clickOnSend()}"
       android:text="@string/font_icon_post_message"
       android:textColor="@color/gray_text_color"
       android:textSize="40sp"/>
 

я получаю эту ошибку для clickable правильной работы:

 Error:(91, 46) Cannot find the setter for attribute 'android:clickable' with parameter type lambda on com.myapp.test.Widgets.FontAwesome. 
 

введите описание изображения здесь

мой пользовательский класс:

 import android.content.Context;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.TextView;

public class FontAwesome extends TextView {
    public FontAwesome(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public FontAwesome(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public FontAwesome(Context context) {
        super(context);
        init();
    }

    private void init() {
        Typeface tf = Typeface.createFromAsset(getContext().getAssets(),
                "fonts/fontawesome.ttf");
        setTypeface(tf);
    }
}
 

как я могу решить эту проблему?

Комментарии:

1. extend android.support.v7.widget.AppCompatTextView это то же самое, что и TextView . AppCompatTextView используется для обеспечения обратной совместимости новых функций со старыми версиями Android.

2. это не проблема, вы можете продлить все, что захотите. Android Studio предупреждает вас только о том, что AppCompatTextView больше подходит для использования в целях совместимости.

3. код все равно будет выполняться…. это только предупреждение

4. включена ли привязка данных ?

Ответ №1:

ОБНОВЛЕНИЕ: Если вы используете библиотеки androidx вместо (устаревших) библиотек поддержки v7 (что вам следует сделать сейчас…), пожалуйста, используйте это вместо:

 import androidx.appcompat.widget.AppCompatTextView;
 

СТАРЫЙ ОТВЕТ: (все еще полезно, если вы еще не перешли на androidx…)

Это пользовательское представление должно расширить android.support.v7.widget.AppCompatTextView вместо

Это Warning , а не Ошибка.

Вместо

 public class FontAwesome extends TextView
 

Вы должны использовать AppCompatTextView

 public class FontAwesome extends AppCompatTextView 
 

Комментарии:

1. Почему? Не могли бы вы, пожалуйста, объяснить, почему одно хорошо, а другое нет.

2. Итак, если нам не нужны ни фоновый рисунок, ни функция автоматического изменения размера, мы все равно можем расширить пользовательский вид из TextView, верно?

3. @KimiChiu Да, но лучше использовать AppCompatTextView, чтобы, если вы решите опубликовать представление в Интернете или захотите использовать какие-либо новые атрибуты

Ответ №2:

У меня была похожая проблема, но она исправлена. Вероятно, вы видите результат только во время выполнения в первый раз. Я не тестировал, чтобы снова перестроить проект, не запустив приложение.

  import android.content.Context;
 import android.graphics.Color;
 import android.support.v7.widget.AppCompatTextView;
 import android.util.AttributeSet;

 public class CustomTxtView extends AppCompatTextView {

    public CustomTxtView(Context context) {
        super(context);
        init();
    }

    public CustomTxtView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CustomTxtView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init(){
        setText("Hello World");
        setTextColor(Color.RED);
    }

}