【问题标题】:Use of GridLayout from support library leads to 'NoSuchMethodError: android.support.v4.view.ViewCompat.getLayoutDirection'使用支持库中的 GridLayout 会导致“NoSuchMethodError: android.support.v4.view.ViewCompat.getLayoutDirection”
【发布时间】:2014-05-06 01:50:32
【问题描述】:

我在我的应用程序中使用了 GridLayout,它运行良好。现在我也必须支持 android 3.xx,所以我包含了 android-support-library-v7。我只是在所有地方更改了 GridLayout 和 LayoutParams 的导入语句。我现在可以构建项目,但是当我运行应用程序时,它会因 NoSuchMethodError 异常而崩溃。

我关注了这些steps to include the support library

这里是堆栈跟踪:

    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

编辑:代码

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);

【问题讨论】:

  • 能否也请把代码贴出来?
  • 代码跨类。当我实例化 GridLayout 时,我得到了这个异常。

标签: android android-support-library android-gridlayout


【解决方案1】:

之所以发生这种情况,是因为我的项目所引用的 android-support-v4 库比最新可用的库更旧。由于我们必须手动将android-support-v4.jar 库复制到我们项目的/libs 文件夹中,因此无论您更新sdk 多少次,在我们手动覆盖项目文件夹中的支持库.jar 之前它都不会产生什么影响.

我哪里出错了?我的印象是我的项目目录中有最新的 android-support-v4.jar。由于我通过更改构建路径和顺序来解决这个问题的所有尝试都失败了,作为最后的手段,我用 /extras/android/support/v4/android 中的一个覆盖了项目 /libs 中的 android-support-v4.jar -支持-v4.jar。瞧,它开始工作了。

这就是我将 support-v7 gridlayout 添加到我的项目中的方式

  1. 将 'gridlayout' 文件夹从 '\extras\android\support\v7' 复制到您的 android 项目所在的位置
  2. 将步骤1中复制的库作为android-library导入工作区
  3. 在您的 android 应用程序上引用从 step2 导入的库

注意:

  1. 执行上述步骤后,检查“android-support-v7-gridlayour.jar”是否包含在您的 android 应用程序项目下的“Android Dependencies”下。
  2. 检查是否在您的 android 应用程序的“project.properties”中为“gridlayout”项目添加了新行。在我的情况下,添加了以下行

     android.library.reference.1=../gridlayout
    
  3. 除了上面提到的步骤之外,我没有按照here中提到的任何其他步骤进行操作

【讨论】:

  • 用最新的替换我的旧 android-support-v4.jar 为我解决了这个问题。不幸的是,我需要在没有 Gradle 支持的情况下使用 IntelliJ 来支持这个项目,所以依赖管理是 $$ 中的一个巨大痛苦。
【解决方案2】:

如果您同时使用android-support-v4android-support-v13,您还需要更新v13。这是我的情况。我已将 v4 更新到最新版本,但仍然收到 错误

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

我注意到 Eclipse 在控制台中的消息:“警告:在依赖项列表中找到 android-support-v4 和 android-support-v13。因为 v13 包括 v4,仅使用 v13”。

所以我已将 \sdk\extras\android\support\v13\android-support-v13.jar 的新版本复制到我项目的 libs 文件夹(已替换旧版本)和错误消失了。

结论:我们可能应该立即更新我们项目中使用的所有支持库。

【讨论】:

    【解决方案3】:

    我在 Xamarin Studio 中遇到了类似的问题。我通过执行以下步骤解决了它:

    1. 清除调试配置中的所有项目。
    2. 清除发布配置中的所有项目。
    3. 手动删除了项目中的packages文件夹。 (删除所有 Nuget 包)。
    4. 重新启动 计算机。
    5. 再次运行项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      • 2013-12-08
      • 2016-10-20
      • 2017-11-04
      • 1970-01-01
      相关资源
      最近更新 更多