2015-01-18 2 views
1

Я использую ForegroundLinearLayout (https://github.com/gabrielemariotti/cardslib/blob/master/library-core/src/main/java/it/gmariotti/cardslib/library/view/ForegroundLinearLayout.java). Это довольно простая реализация.Drawable setState возвращает true, но не меняет внешний вид

Однако, я поставил некоторые ForegroundLinearLayouts в RecyclerViews, а иногда (примерно в 50% случаев) нажатое состояние моего переднего плана не будет отображаться до тех пор, пока вид не будет переработан (я прокручиваю вниз по первому экрану Views).

Я думаю, проблема кроется в mForegroundDrawable.setState (getDrawableState()).

Я обнаружил, что drawableStateChanged() вызывается в моем ForegroundLinearLayouts, а getDrawableState() показывает правильные значения, когда я нажимаю и отпускаю View, а mForegroundDrawable.setState (getDrawableState()) даже возвращает true.

Даже неявное обращение к mForegroundDrawable.invalidateSelf() и this.invalidate() в ForegroundLinearLayout не помогло.

Нажатое состояние не будет отображаться примерно на 50% времени на первом экране видов. Использование фона фонового изображения, но на переднем плане нет.

У кого-нибудь есть идеи, что сломано?

Я действительно не хочу обертывать все свои ForegroundLinearLayouts в FrameLayouts.

ответ

0

Принял меня 3 дня, чтобы понять это.

Мои границы переднего плана (mForeground.getBounds()) возвращали иногда 0, 0 - 0, 0 Rect. Когда это сработает, оно вернет правильные границы 0, 0 - ширину, высоту.

Если кто-нибудь знает, почему, пожалуйста, скажите мне, потому что я собираюсь сделать запрос на растяжение на ForegroundLinearLayout.

Я просто положил эту линию в ничью (холст холста) после нулевой проверки на mForeground: mForeground.setBounds (0, 0, getWidth(), getHeight());

Бум, исправлено все.

Но, если на переднем плане всегда есть эти границы? Я так не думаю; Я думаю, что мне нужно учитывать дополнения и т. Д. Я посмотрю больше в этом, но любой комментарий здесь был бы неоценим.

+0

Границы уже, кажется, правильно установить в 'рисовать()' метод в соответствии с (полный по умолчанию), если макет был изменен или инициализирован.С другой стороны, границы, кажется, не установлены должным образом, если чертеж переднего плана установлен после того, как представление было макетом и нарисовано, так что это единственный случай, когда границы, возможно, не были правильно инициализированы. – corsair992

1

Это приходит слишком поздно, но я наткнулся на ваш комментарий в оригинальной gist

Установка границ на каждом draw() ненужно.

Как уже отмечалось, corsair992 draw() устанавливает границы в большинстве случаев. Однако, если onLayout() вызывается несколько раз до draw(), флаг mForegroundBoundsChanged для установки границ устанавливается в false, и границы никогда не устанавливаются. я столкнулся с этой проблемой с DrawerLayout и оставил комментарий в оригинальной сущности, но вот простое исправление:

@Override 
protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
    super.onLayout(changed, left, top, right, bottom); 
    if (changed) mForegroundBoundsChanged = true; 
} 
Смежные вопросы