3

もしそうなら、ScrollViewはどちらかといえば懐かしい(疑わしい)か、それを行うための他の方法があるようです。ここに私のコードです。それが爆発する場所(2回目はループを通ります)はコメントされています。複数のビューをScrollViewに追加することはできませんか?

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.ondemandandautomatic_dynamicauthorize); 

    ScrollView svh = (ScrollView) findViewById(R.id.scrollViewHost); 

    // Contacts data snippet adapted from 
    // http://saigeethamn.blogspot.com/2011/05/contacts-api-20-and-above-android.html 
    ContentResolver cr = getContentResolver(); 
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, 
      null, null, null); 
    if (cur.getCount() > 0) { 
     while (cur.moveToNext()) { 
      String id = cur.getString(cur 
        .getColumnIndex(ContactsContract.Contacts._ID)); 
      String name = cur 
        .getString(cur 
          .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

      // Create a Linear Layout for each contact? 
      LinearLayout llay = new LinearLayout(this); 
      llay.setOrientation(LinearLayout.HORIZONTAL); 

      LinearLayout.LayoutParams llp = new LayoutParams(
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
      llp.weight = 1.0f; 

      CheckBox cbOnDemand = new CheckBox(getApplicationContext()); 
      cbOnDemand.setTag(id); 
      cbOnDemand.setLayoutParams(llp); 
      llay.addView(cbOnDemand); 

      CheckBox cbTime = new CheckBox(getApplicationContext()); 
      cbOnDemand.setTag(id); 
      cbTime.setLayoutParams(llp); 
      llay.addView(cbTime); 

      CheckBox cbSpace = new CheckBox(getApplicationContext()); 
      cbOnDemand.setTag(id); 
      cbSpace.setLayoutParams(llp); 
      llay.addView(cbSpace); 

      TextView tv = new TextView(getApplicationContext()); 
      tv.setTag(id); 
      tv.setText(name); 
      tv.setLayoutParams(llp); 
      llay.addView(tv); 

      svh.addView(llay); // it transports me to Eclipse's Debug perspective when I hit this line the SECOND time around. 
      // One cat on stackOverflow said to do this, another said it 
      // would be unnecessary 
      svh.invalidate(); 
     } 
    } 
} 

答えて

9

あなたがこの問題を解決するために行うことができる2つのものがあります。

1)ScrollViewの唯一の子が垂直LinearLayoutも作り、LinearLayout代わりのScrollViewにあなたの子供のすべてを追加します。

2)ListViewを使用することが好ましいでしょう(これは、ScrollViewの内部にLinearLayoutを使用して実装されている可能性があります)。

+0

ご協力いただきありがとうございます。オプション2の問題は、実行時に各チェックボックスをプログラムで識別できる方法を見つけることができないということです。どのチェックボックスをオンにするかどの行がクリックされているかを示します。連絡先IDに対応するタグ値を持つチェックボックスが必要なので、各連絡先に対してどのオプションが選択されているかわかります。だから、動的に作成するウィジェットのルートを行ったので、チェックボックス(およびtextView)ウィジェットを作成するループにそのタグを追加できます。 –

+0

オプション2はなぜ好ましいですか? – Johan

6

ScrollViewには1つのビューのみを含めることができます。しかし、そのビューはLinearLayoutのようなレイアウトになる可能性があります。通常私がやることは、そのようなビューをScrollViewに追加することです。

例:

<ScrollView> 
    <LinearLayout> 
    <ImageView/> 
    <TextView/> 
    </LinearLayout> 
</ScrollView> 
+1

彼がまだ混乱している場合に備えて。 LinearLayoutはScrollViewの内部に直接配置されます。それはあなたがそこに入れたいすべてのものをラッパーするために使われます。 –

+1

私は、LinearLayoutをScrollViewの中に入れていると思います。私はその後、3つのチェックボックスとtextViewを含むLinearLayoutsを作成し、それらをScrollViewではなく、最も外側のLinearLayoutに追加する必要があると思います。 –

関連する問題