Использование GridLayout из библиотеки поддержки приводит к «NoSuchMethodError: android.support.v4.view.ViewCompat.getLayoutDirection»

Я использую GridLayout в своем приложении, и он отлично работает. Теперь я должен поддерживать android 3.xx, поэтому я включил android-support-library-v7. Я просто изменил инструкции импорта для GridLayout и LayoutParams во всех местах. Теперь я могу создать проект, но когда я запускаю приложение, он выходит из строя с исключением NoSuchMethodError.

Я выполнил следующие шаги, чтобы включить библиотеку поддержки

Вот стек:

03-27 13:37:13.454: E/AndroidRuntime(23016): FATAL EXCEPTION: main 03-27 13:37:13.454: E/AndroidRuntime(23016): java.lang.NoSuchMethodError: android.support.v4.view.ViewCompat.getLayoutDirection 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.support.v7.widget.GridLayout.isLayoutRtlCompat(GridLayout.java:675) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.support.v7.widget.GridLayout.getDefaultMargin(GridLayout.java:660) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.support.v7.widget.GridLayout.getMargin1(GridLayout.java:671) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.support.v7.widget.GridLayout$Axis.computeMargins(GridLayout.java:1547) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.support.v7.widget.GridLayout$Axis.getLeadingMargins(GridLayout.java:1558) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.support.v7.widget.GridLayout.getMargin(GridLayout.java:683) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.support.v7.widget.GridLayout.getTotalMargin(GridLayout.java:692) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.support.v7.widget.GridLayout.measureChildWithMargins2(GridLayout.java:897) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.support.v7.widget.GridLayout.measureChildrenWithMargins(GridLayout.java:911) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.support.v7.widget.GridLayout.onMeasure(GridLayout.java:950) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.View.measure(View.java:15848) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1052) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.LinearLayout.onMeasure(LinearLayout.java:590) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.View.measure(View.java:15848) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.HorizontalScrollView.measureChildWithMargins(HorizontalScrollView.java:1229) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.HorizontalScrollView.onMeasure(HorizontalScrollView.java:301) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.View.measure(View.java:15848) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.View.measure(View.java:15848) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.View.measure(View.java:15848) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.View.measure(View.java:15848) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.ListView.setupChild(ListView.java:1918) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.ListView.makeAndAddView(ListView.java:1843) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.ListView.fillDown(ListView.java:675) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.ListView.fillSpecific(ListView.java:1333) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.ListView.layoutChildren(ListView.java:1633) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.AbsListView.onLayout(AbsListView.java:2012) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.View.layout(View.java:14289) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.ViewGroup.layout(ViewGroup.java:4559) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1076) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.View.layout(View.java:14289) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.ViewGroup.layout(ViewGroup.java:4559) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1076) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.View.layout(View.java:14289) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.ViewGroup.layout(ViewGroup.java:4559) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.View.layout(View.java:14289) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.ViewGroup.layout(ViewGroup.java:4559) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.LinearLayout.onLayout(LinearLayout.java:1434) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.View.layout(View.java:14289) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.ViewGroup.layout(ViewGroup.java:4559) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.View.layout(View.java:14289) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.ViewGroup.layout(ViewGroup.java:4559) 03-27 13:37:13.454: E/AndroidRuntime(23016): at android.view.ViewRootImpl.perfor 

EDIT: код

 public class TableRenderingView extends GridLayout{ private Context mContext; public TableRenderingView(Context context){ super(context); mContext = context; setUseDefaultMargins(true); setAlignmentMode(ALIGN_BOUNDS); setRowOrderPreserved(false); } ... } 

Исключение происходит, когда я пытаюсь добавить этот расширенный класс динамически внутри LinearLayout

 TableRenderingView trv = new TableRenderingView(context); View v = trv.populate(gridRowData); LinearLayout ll = ((LinearLayout) tableContainerView.getChildAt(0)); ll.removeAllViews(); ll.addView(v); 

Так что это происходило, потому что библиотека android-support-v4, о которой шла речь в моем проекте, была старше последней версии. Поскольку мы должны скопировать библиотеку android-support-v4.jar вручную в папку нашего проекта / libs, независимо от того, сколько раз вы обновляете sdk, это будет иметь небольшое влияние, пока мы не перезапишем вручную библиотеку поддержки .jar, которая есть в папке проекта ,

Где я ошибся? У меня сложилось впечатление, что в моем каталоге проектов у меня есть последняя версия поддержки android-v4.jar. Поскольку все мои попытки решить эту проблему путем изменения пути сборки и порядка не удалось, в качестве окончательного варианта я перезаписал мою версию android-support-v4.jar в проекте / libs с помощью одного в / extras / android / support / v4 / android -Поддержка-v4.jar. Вуала начала работать.

И вот как я добавил поддержку-v7 gridlayout в свой проект

  1. Скопируйте папку «gridlayout» из «\ extras \ android \ support \ v7» в место, где расположен ваш проект Android
  2. Импортируйте библиотеку, скопированную в step1, в качестве андроидной библиотеки в рабочее пространство
  3. Ссылка на импортированную библиотеку с шага 2 в приложении для Android

Заметка:

  1. После выполнения вышеуказанных шагов проверка «android-support-v7-gridlayour.jar» включена в «Android Dependencies» в вашем проекте приложения Android.
  2. Проверьте, добавлена ​​ли новая строка для проекта «gridlayout» в «project.properties» приложения для Android. В моем случае была добавлена ​​нижняя строка

      android.library.reference.1=../gridlayout 
  3. Помимо вышеупомянутых шагов я не выполнял никаких других шагов, упомянутых здесь

Если вы используете android-support-v4 и android-support-v13 вам также нужно обновить v13. Это был мой случай. Я обновил v4 до последней версии, но все еще получал ошибку :

Java.lang.NoSuchMethodError: android.support.v4.view.ViewCompat.hasOnClickListeners .

Я заметил сообщение Eclipse на консоли: «ПРЕДУПРЕЖДЕНИЕ: В списке зависимостей были указаны как андроид-поддержка-v4, так и андроид-поддержка-v13. Поскольку v13 включает v4 , используя только v13».

Поэтому я скопировал новую версию \ sdk \ extras \ android \ support \ v13 \ android-support-v13.jar в папку с папками моего проекта (заменил старую версию), и ошибка исчезла.

Вывод: мы должны, вероятно, обновить все библиотеки поддержки, которые используются в наших проектах сразу.

У меня была аналогичная проблема в Xamarin Studio. Я решил это, выполнив следующие действия:

  1. Очистите все проекты в конфигурации отладки.
  2. Очистите все проекты в конфигурации конфигурации.
  3. Вручную удалил папку пакетов в проекте. (Удаление всех пакетов Nuget).
  4. Перезагрузите компьютер.
  5. Запустите проект еще раз.