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

Пользовательский конструктор представлений не вызывается в android 5.0.2

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

public class SomeView extends View

Пользовательские конструкторы представлений:

public SomeView (Context context)
{
    super(context);
}
// Called when view is inflated from xml
public SomeView (Context context, AttributeSet attrs)
{
    super(context, attrs);
}
// Perform inflation from XML and apply a class-specific base style from a theme attribute.
public SomeView (Context context, AttributeSet attrs, int defStyle)
{
    super(context, attrs, defStyle);
}

Я также попробовал 4-й конструктор из api 21 без везения:

public VeediView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
{
    super(context, attrs,defStyleAttr, defStyleRes);
}

В макете xml я определяю этот вид, и все работает нормально.

Тестирование на Galaxy S2 прекрасно работает и вызывается конструктор вида, но при запуске приложения на Nexus-7 android 5.0.2 конструкторы вообще не вызываются.

Любая идея, почему?

Может ли это быть связано с корневыми устройствами?

Связанный вид xml:

<com.package.name

        android:id="@+id/scene"
        android:onClick="startx"
        style="@style/txt_money_style"
        android:layout_width="72dp"
        android:layout_height="72dp"
        android:background="@drawable/wtbtn"
        android:layout_gravity="right"
        android:gravity="center_vertical|right"
        />
4b9b3361

Ответ 1

Дело в том, что я получил этот код и не разработал его сам, и после того, как он попробовал все, оказалось, что приложение имеет несколько файлов макета:

layout-large, макет-малый и т.д.

Я только определил пользовательский вид в папке макета, поэтому переключение на другие размеры экрана вызвало обычный просмотр.

Я думаю, что другие могут узнать из моей ошибки, я хочу, чтобы Android Studio или Eclipse могли поддерживать какой-то setContentView (R.layout.activity_scene) и соответствующую опцию отладки файла

Итак, ответ заключается в том, чтобы убедиться, что все макеты имеют настраиваемое представление

Ответ 2

В API 21 теперь существует 4-й конструктор, это может быть так, что ваш XML вызывает это.

Из документов:

public View (контекст контекста, AttributeSet attrs, int defStyleAttr, int defStyleRes)

Добавлен в уровень API 21

Выполните инфляцию из XML и примените базовый стиль для класса из атрибута темы или ресурса стиля. Этот конструктор View позволяет подклассам использовать свой собственный базовый стиль при раздувании.

При определении окончательного значения определенного атрибута вступают в игру четыре входа:

  • Любые значения атрибутов в заданном наборе атрибутов.
  • Ресурс стиля, указанный в AttributeSet (называемый "стиль" ).
  • Стиль по умолчанию, заданный defStyleAttr.
  • Стиль по умолчанию, заданный defStyleRes.
  • Базовые значения в этой теме.

Каждый из этих входов рассматривается в порядке, причем первый из них имеет приоритет над следующими. Другими словами, если в параметре AttributeSet, который вы предоставили, текст кнопки всегда будет черным, независимо от того, что указано в любом из стилей.

Параметры

контекст Контекст, в котором запущен вид, через который он может обращаться к текущей теме, ресурсам и т.д. attrs Атрибуты тега XML, которые раздувают представление. defStyleAttr Атрибут текущей темы, содержащий ссылку на ресурс стиля, который поставляет значения по умолчанию для представления. Может быть 0, чтобы не искать значения по умолчанию. defStyleRes Идентификатор ресурса ресурса стиля, который поставляет значения по умолчанию для представления, используется только в том случае, если defStyleAttr равен 0 или не может быть найден в теме. Может быть 0, чтобы не искать значения по умолчанию.

Ответ 3

Я думаю, вы должны использовать этот конструктор для наилучшего:

public SomeView (Context context)
{
    this(context , null);
}
// Called when view is inflated from xml
public SomeView (Context context, AttributeSet attrs)
{
    this(context, attrs , 0);
}
// Perform inflation from XML and apply a class-specific base style from a theme attribute.
public SomeView (Context context, AttributeSet attrs, int defStyle)
{
    super(context, attrs, defStyle);
    // Initialize customize constructor here
}

Ответ 4

Вот исходный код упомянутого класса View.java. Если вы проверите это, вы увидите, что public View(Context context) всегда вызывается. Если вы считаете, что он не вызывается, но вы видите представление, то проблема скорее в части, определяющей, будет ли она вызвана, чем в коде Android. Вы должны посмотреть туда. Это может быть код регистрации или некоторые неправильные фильтры в AS или аналогичные.

Из исходного кода вы также можете видеть, что это новый конструктор, используемый в Android 5.0 выше, который имеет наибольшую реализацию.

public View(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)