Intereting Posts
Ga_autoActivityTracking = true: исключить определенные действия из отчетов Цель: URI не работает в браузере Android Невозможно запустить проект React-Native UIExplorer Подключение Kinect к Android Включение поддержки WebGL для Android WebView Потоковое видео в VideoView работает только на Wi-Fi при использовании телефонов Samsung FATAL EXCEPTION: main java.lang.RuntimeException: контент имеет представление с атрибутом id 'android.R.id.list', который не является классом ListView Оптимизация компилятора кода Java в Android Как использовать стандартные значения параметров предпочтений в классе поверхностного вида в Android Proguard.ParseException: Ожидание имени члена класса до «@» в Android Eclipse ADT Есть ли способ отладить приложение Android на телефоне без USB-соединения? Jfreechart: Как исключить выходные дни из графика? Как передать правильные данные в шейдерную программу OpenGL-ES 2.0 Почему arent строки (и аналогичные цвета) определены в пространстве имен android? Автозаполнение перестало работать с android sdk

«RequestLayout () неправильно вызван …» ошибка на Android 4.3

У меня есть простой пользовательский TextView, который устанавливает пользовательский шрифт в его конструкторе, например, код ниже

public class MyTextView extends TextView { @Inject CustomTypeface customTypeface; public MyTextView(Context context, AttributeSet attrs) { super(context, attrs); RoboGuice.injectMembers(context, this); setTypeface(customTypeface.getTypeface(context, attrs)); setPaintFlags(getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG); } } 

Он отлично работает с Gingerbread через JB 4.2. Но logcat adb заливается следующими сообщениями, когда я показываю свой пользовательский текстовый просмотр на телефоне Android 4.3.

 10-05 16:09:15.225: WARN/View(9864): requestLayout() improperly called by com.cmp.views.MyTextView{42441b00 V.ED.... ......ID 18,218-456,270 #7f060085 app:id/summary} during layout: running second layout pass 10-05 16:09:15.225: WARN/View(9864): requestLayout() improperly called by com.cmp.views.MyTextView{423753d0 V.ED.... ......ID 26,176-742,278 #7f060085 app:id/summary} during layout: running second layout pass 

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

Ценю вашу помощь.

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

У меня была строка (конечно, не добавленная мной):

 myView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { //this would then make a call to update another view's layout. } }); 

В моем приложении мне не нужен какой-либо прослушиватель, поэтому удаление всего этого блока устраняет эту проблему. Для тех, кому нужно что-то вроде этого, не забудьте удалить слушателя после изменения макета (внутри этого обратного вызова).

Изучая источник Android , эта проблема описана чуть подробнее:

requestLayout() во время компоновки. Если на запрашивающих представлениях не установлены флаги запроса компоновки, нет проблем. Если некоторые запросы все еще ожидаются, нам нужно очистить эти флаги и выполнить полный запрос / меру / макет, чтобы справиться с этой ситуацией.

Похоже, что проблема может быть связана с Roboguice; См. Вопрос № 88 . Предлагаемое решение заключается в использовании @InjectView:

Теперь вы можете использовать @InjectView из класса представления. Просто вызовите Injector.injectMembers () после того, как вы заполнили свой вид, ala:

 public class InjectedView extends FrameLayout { @InjectView(R.id.view1) View v; public InjectedView(Context context) { super(context); final View child = new View(context); child.setId(R.id.view1); addView(child); RoboGuice.getInjector(context).injectMembers(this); } } 

Возможно, вам стоит рассмотреть возможность переноса RoboGuice.injectMembers(context, this) на объявление вашего объекта View с помощью аннотации @InjectView.

Я исправил эти предупреждения в своем элементе ListView (подкласс LinearLayout ). Этот класс реализует Checkable и имеет setChecked(boolean checked) который вызывается, чтобы указать, проверен ли элемент:

 @Override public void setChecked(boolean checked) { mChecked = checked; TextView textView = (TextView)this.findViewById(R.id.drawer_list_item_title_text_view); if(mChecked) { textView.setTypeface(Typeface.createFromAsset(getContext().getAssets(), "font/Andada-Bold.ttf")); } else { textView.setTypeface(Typeface.createFromAsset(getContext().getAssets(), "font/Andada-Regular.ttf")); } } 

Я визуально setTypeFace() проверенное состояние, вызвав setTypeFace() в текстовом элементе в моем представлении, переключая между обычными и полужирным шрифтом. Эти setTypeFace() вызывали предупреждения.

Чтобы исправить эту проблему, я создал переменные экземпляра для Typeface s в конструкторе класса и использовал их позже, когда вы меняете шрифт, а не вызываете Typeface.createFromAsset(...) каждый раз:

 private Typeface mBoldTypeface; private Typeface mRegularTypeface; public DrawerView(Context context, AttributeSet attrs) { super(context, attrs); initTypefaces(); } private void initTypefaces() { this.mBoldTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/Andada-Bold.ttf"); this.mRegularTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/Andada-Regular.ttf"); } @Override public void setChecked(boolean checked) { mChecked = checked; TextView textView = (TextView)this.findViewById(R.id.drawer_list_item_title_text_view); if(mChecked) { textView.setTypeface(mBoldTypeface); } else { textView.setTypeface(mRegularTypeface); } } 

Это довольно специфический сценарий, но я был приятно удивлен, найдя исправление, и, возможно, кто-то еще находится в той же ситуации.

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

Я встретил ту же проблему. Это потому, что я пытался установить позицию представления в режиме iOS. Вы знаете, что в iOS задано положение представления, задав левое верхнее значение и ширину, высоту. Но в Android это должно быть (левое, верхнее, правое, нижнее). Я много внимания уделял этому. Когда я вскакиваю в определение layout() , я читаю комментарий метода, затем выясняю, почему произошло предупреждение.