0

私はここでかなり厄介な問題を抱えています。私はまだ私がしていることのすべてのビットを内部化しようとしているので、

私は現在LinearLayoutを持っていますが、アクティビティのonCreate時に、ボタンを使用して他のいくつかのLinearLayoutにデータを入力または膨らませます。問題は、ボタンにアクセスしようとすると、 LinearLayout、私が得ることができるのはLinearLayout(Parent)と他のLinearLayout(Children)だけです、私は方法があると信じています、私はそれを行う方法を完全に混乱させています。

LinearLayout
 ->LinearLayout(Child1)->Button1, Button2, Button3
 ->LinearLayout(Child2)->Button4, Button5, Button6

ボタンにアクセスして取得するにはどうすればよいですか?

私の情報源;

for (int x=0; x<ll.getChildCount(); x++){
  View v = ll.getChildAt(x);
  Class c = v.getClass();
  if(c == LinearLayout.class){
    for(int y=0; y< ; y++){
      **I know there is something that must be done here, likewise, is this the most
      efficient way of doing things?
    }
  }
 Log.i("test", c.getName());
}

XMLにはLinearLayout(Parent)のみが存在し、その他は実行時に拡張されます。

4

1 に答える 1

0

vにキャストするだけLinearLayoutで、親の場合と同じようにその子にアクセスできるはずです。何かのようなもの:

for (int x=0; x<ll.getChildCount(); x++){
  View v = ll.getChildAt(x);
  Class c = v.getClass();
  if(c == LinearLayout.class){
    //Cast to LinearLayout since View doesn't expose a way to access children
    LinearLayout innerLayout = (LinearLayout)v;
    for(int y=0; y<innerLayout.getChildCount() ; y++){
      Button b = (Button)innerLayout.getChildAt(y);

      //Do something with b
    }
  }
 Log.i("test", c.getName());
}


正確な階層によっては、リフレクションを削除し、単にnullチェックを実行することでこれを単純化できる可能性があります(必要に応じて、try / catchでラップしてcatchしますClassCastException)。私は通常、動的に生成されたレイアウトツリーをトラバースする必要がある状況で次のようなことを行いました。

for (int i = 0; i < outerLayout.getChildCount(); ++i)
{
    try
    {
        LinearLayout innerLayout = (LinearLayout)outerLayout.getChildAt(i);

        if (innerLayout != null)
        {
            for (int j = 0; j < innerLayout.getChildCount(); ++j)
            {
                Button btn = (Button)innerLayout.getChildAt(j);

                //Do something with btn
            }
        }
    }
    catch (ClassCastException cEx)
    {
        Log.w("WARN", "Unexpected child type in outerLayout. " + cEx.getMessage());
    }
}

これはテストされていない例です(要件とレイアウトによっては、より適切な例外処理が必要になる場合があります)が、一般的な考え方が得られることを願っています。もう少しタイプにとらわれないようにしたい場合は、ViewGroup代わりにキャストを使用することもできます。これにより、必要に応じて、さまざまな種類のレイアウトコンテナを子として使用できるようになります。これは、それらがのサブクラスであるためですViewGroup(継承元getChildAt()と継承元getChildCount())。

于 2012-05-11T18:20:49.067 に答える