3

我之前曾问过一个关于此错误的问题(ViewGroup.resetResolvedTextDirection 中的 Android StackOverflowError),但是现在我设法在模拟器中重现了该错误并缩小了发生此问题的具体位置。

当我开始我的活动时,我有一个AsyncTask,它从我的服务器中提取必要的数据并创建所有视图。在run()AsyncTask 的方法中,我正在创建一个自定义视图(并将其添加到活动的主视图中——但这现在并不重要):

ListingView listing = new ListingView(MainActivity.this);

ListingView是我的自定义视图类,它从LinearLayout. 在此自定义视图的构造函数中,我有以下代码:

public ListingView(Context context)
{
    this.context = context;
    ...

    LayoutInflater infl = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View top = infl.inflate(R.layout.listing, this, true);
    this.addView(top);
    ...

    LinearLayout lst = (LinearLayout)this.findViewById(R.id.LayoutListingTop);
    tblVenues = new ListView(context);
    tblVenues.setVisibility(VISIBLE);
    tblVenues.setItemsCanFocus(true);
    tblVenues.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if(venueListener != null && venues.size() > 0) { venueListener.selected(venues.get(position)); }
        }
    });
    LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    lst.addView(tblVenues, lp);    //this line causes the problem

    ...
}

在这个自定义视图类中,tblVenues声明为

private ListView tblVenues;

正在加载的 XML 是这样的:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:id="@+id/LayoutListingTop"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:background="@color/white">
    <ImageView android:id="@+id/ImageView01"
               android:layout_width="170dp"
               android:layout_height="62dp"
               android:src="@drawable/ookl_logo"
               android:layout_gravity="left"
               android:adjustViewBounds="false"
               android:scaleType="fitXY">
    </ImageView>

    <TextView android:layout_height="wrap_content"
              android:layout_width="fill_parent"
              android:layout_marginBottom="5px"
              android:gravity="center"
              android:textColor="@color/black"
              android:text="@string/love_culture"
              android:id="@+id/TextView01"
              android:textSize="28dip">
    </TextView>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:orientation="horizontal"
                  android:id="@+id/ButtonBar"
                  android:layout_width="fill_parent"
                  android:layout_height="wrap_content"
                  android:background="@drawable/buttonbar"
                  android:paddingLeft="10px"
                  android:paddingRight="10px"
                  android:paddingTop="5px"
                  android:paddingBottom="5px">

        <Button android:id="@+id/BtnListVenues"
                     android:layout_width="wrap_content"
                     android:layout_height="45dip"
                     android:background="@null"
                     android:text="@string/button_venues"
                     android:drawableTop="@drawable/icon_venues_on"
                     android:textColor="@color/venue_blue"
                     android:layout_marginRight="10px"
                     android:textSize="9dip">
        </Button>

        <Button android:id="@+id/BtnListEvents"
                     android:layout_width="wrap_content"
                     android:layout_height="45dip"
                     android:background="@null"
                     android:text="@string/button_events"
                     android:drawableTop="@drawable/icon_events_off"
                     android:textColor="@color/white"
                     android:layout_marginRight="10px"
                     android:textSize="9dip">
        </Button>

        <Button android:id="@+id/BtnListTrails"
                     android:layout_width="wrap_content"
                     android:layout_height="45dip"
                     android:background="@null"
                     android:text="@string/button_trails"
                     android:drawableTop="@drawable/icon_trails_off"
                     android:textColor="@color/white"
                     android:layout_marginRight="10px"
                     android:textSize="9dip">
        </Button>

        <Button android:id="@+id/BtnListObjects"
                     android:layout_width="wrap_content"
                     android:layout_height="45dip"
                     android:background="@null"
                     android:text="@string/button_objects"
                     android:drawableTop="@drawable/icon_objects_off"
                     android:textColor="@color/white"
                     android:layout_marginRight="10px"
                     android:textSize="9dip">
        </Button>

        <TextView android:id="@+id/TxtLabelDistance"
                  android:layout_width="fill_parent"
                  android:text="@string/label_distance"
                  android:layout_height="wrap_content"
                  android:gravity="right|bottom"
                  android:layout_alignParentBottom="true"
                  android:textColor="@color/white"
                  android:layout_marginTop="-17px"
                  android:textSize="9dip">
        </TextView>
    </LinearLayout>


</LinearLayout>

这一切在 Android 形式 1.6 到 3.x 上都可以正常工作,但是在 Ice Cream Sandwich (4.0) 线上

lst.addView(tblVenues, lp);

结果StackOverflowError

java.lang.StackOverflowError
at android.view.ViewGroup.resetResolvedTextDirection(ViewGroup.java:5131)
at android.view.ViewGroup.resetResolvedTextDirection(ViewGroup.java:5131)
at android.view.ViewGroup.resetResolvedTextDirection(ViewGroup.java:5131)
at android.view.ViewGroup.resetResolvedTextDirection(ViewGroup.java:5131)
at android.view.ViewGroup.resetResolvedTextDirection(ViewGroup.java:5131)
at android.view.ViewGroup.resetResolvedTextDirection(ViewGroup.java:5131)
... this line repeats about 200 times or so ...

LogCat 中没有其他有用的东西。整个 ListingView 甚至还没有添加到主活动视图中,因为错误基本上是从它的构造函数中抛出的。

我完全不知道可能是什么问题。任何帮助将不胜感激。

4

3 回答 3

5

[老问题,但我对答案不满意,所以添加我的笔记,希望它们对其他人有帮助。]

Aleks——我同意核心问题是一个 Android 错误,但跟踪代码(我最近遇到了类似的问题)我相信可以通过将 attachToRoot 参数设置为 false 来防止该问题。这是因为使用 attacheToRoot==true 时,返回的视图是您传入的“root”参数。在您的情况下是“this”,然后添加当前视图的子视图(您将对象添加为子视图本身)。这似乎使 android 感到困惑(它确实应该检查例如是否相等)。

http://developer.android.com/reference/android/view/LayoutInflater.html#inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup, boolean)

“[返回] 膨胀层次结构的根视图。如果提供了 root 并且 attachToRoot 为真,则这是根;否则它是膨胀 XML 文件的根。”

进行此更改解决了我的问题。

于 2013-05-27T04:21:21.760 回答
3

更新:这实际上是一个糟糕的建议,这是我多年来使用 API 学到的。查看投票最多的答案。即使很难获得,也必须添加父视图。我相信这是因为layout_来自膨胀 XML 的根元素中的参数取决于父布局。例如layout_below(或类似的东西)如果您的元素是 a 的子元素则可用RelativeLayout。至少我null进去的时候遇到了相关的问题。

我在调试Android本身,因为我犯了同样的错误,我找到了真正的原因。真正的问题在于以下几行:

View top = infl.inflate(R.layout.listing, this, true);
this.addView(top);

如您所见,您this作为 inflate 的第二个参数传递,它已经将膨胀视图添加到this,所以当您这样做时this.addView(top),它会再添加一次。您有两个选项可以纠正这样的错误:删除该行this.addView(top),或替换thisnull. 我还没有尝试过第二个,但它应该也可以工作,并且可能是一个更好的解决方案,如果您想在膨胀后添加到父级之前操纵视图。

BigDSK 提到的attachToRoot参数可能就足够了,但我发现传递null和 addViewing 之后,或者省略addView是一个更防弹的解决方案(恕我直言),所以我想我会分享。

于 2014-06-08T16:20:16.037 回答
2

在将我的头撞到墙上很长一段时间并尝试了各种不同的方法之后,我相信,这确实是一个 android 中的错误,当视图visibility被明确设置为VISIBLE但视图本身和视图的父级是未添加到主视图。

我终于通过将 ListView 添加到 XML 并将代码移动setVisibility(View.VISIBLE)到整个视图添加到主视图之后解决了这个问题(即,可以从每个子视图一直跟踪到父层次结构)。

至少我不再收到此错误。

于 2012-02-24T15:12:32.373 回答