2012-02-23 13 views
3

Android StackOverflowError in ViewGroup.resetResolvedTextDirection)の前に私はこのエラーについて質問しましたが、エミュレータでエラーを再現するようになったので、この問題が発生する特定の場所を絞り込みました。ListViewをLinearLayoutに追加するときのStackOverflowError

アクティビティを開始するとき、私はAsyncTaskを持っています。私のサーバーから必要なデータを取り出し、すべてのビューを作成します。 AsyncTaskのrun()メソッド内で、私は、カスタムビューを作成しています(と活動のメインビューに追加する - それは今重要ではありません):

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> 

Ice Cream Sandwich(4.0)ラインでAndroidフォーム1.6から完全に正常に動作します。

で3210の
lst.addView(tblVenues, lp); 

結果:

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に有用他に何もありません。リストビュー全体は、メインのアクティビティビューにまだ追加されていません。なぜなら、エラーは基本的にそのコンストラクタからスローされるからです。

私は問題が何であるかについて完全に迷っています。どんな助けでも大歓迎です。

答えて

2

かなりの時間のために壁に頭を強打し、異なるアプローチのすべての種類を試した後、私は信じて、これは本当にビューのvisibilityが明示的にVISIBLEに設定されているときに発揮されるアンドロイド、中にバグではなくビューでありますビューの親はメインビューに追加されません。

私は最終的に、XMLにListViewを追加し、ビュー全体がメインビューに追加された後にコードsetVisibility(View.VISIBLE)を移動しました。つまり、親階層は各子から末尾までトレースできます。

少なくとも私はもうこのエラーが発生していません。

4

[古い質問が、私はそう、彼らは他の誰かのために有用だことを期待して、私のノートを追加し、答えに満足していなかった。]

ALEKS - 私は問題の核心は、Androidであることに同意しますバグですが、コードにトレースすると(最近似たような問題が発生しました)、attachToRootパラメータをfalseに設定して膨張させることで問題を防ぐことができます。これは、attacheToRoot == trueの場合、返されたビューは渡された 'root'パラメータであるためです。あなたのケースでは、現在のビューの子を追加する(thisを子として追加していますそれ自身の)。これはアンドロイドを混乱させるようです(実際には等価性を確認する必要があります)。

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

"[戻り値]膨張した階層のルートビューをルートを供給・attachToRootがtrueた場合、これはrootです;。それ以外の場合は、膨張したXMLファイルのルートです。"

私の場合、この変更により問題が解決されました。

+0

興味深い...はい、この質問は古く - 私は当時(明らかに)問題を解決しました。しかし、今私は同じ問題の別のレポートを受け取りました - 特に三星銀河4デバイス。奇妙なことに、それはアンドロイドの同じバージョンを持つ他のデバイスでは発生しないので、これはサムスンの実装のバグでなければなりません。残念ながら、SG4は自分で持っていないので、デバッグするのは非常に難しいでしょう。私はあなたのアイデアを試してみましょう。 –

2

私は同じ間違いをしたため、Android自体をデバッグしていましたが、本当の理由が見つかりました。本当の問題は、これらのライン内にある:

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

あなたが見ることができるように、あなたはすでにthisに膨張したビューを追加するのinflateの2番目のパラメータとしてthisを渡し、あなたがthis.addView(top)を行うときに、それが1つ多く追加されます時間。このような間違いを修正するには、this.addView(top)という行を削除するか、thisnullに置き換える2つの方法があります。私は2番目を試していませんが、それはうまくいくはずですが、インフレーション後に親に追加する前にビューを操作したい場合は、おそらくもっと良い解決策です。

BigDSKが言及したことをattachToRootパラメータは、十分かもしれませんが、私はnullを渡し、そしてaddViewingその後、またはaddViewを省略すると、より防弾ソリューション(私見)ですので、私は私が共有するだろうと思ったことがわかります。

関連する問題