web-dev-qa-db-ja.com

プログラムで複数のLinearLayoutsを1つのビューに追加してから、ViewFlipperに追加するにはどうすればよいですか?

質問のタイトルが問題の良い説明になることを願っています。

このXMLを作成したいのですが、プログラムで作成します(プログラムで作成しないことを提案しないでください^ _ ^)

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android" 
Android:orientation="vertical"
Android:padding="10dip" 
Android:layout_width="fill_parent"
Android:layout_height="fill_parent">

<TextView   Android:layout_width="fill_parent"
            Android:layout_height="wrap_content"
            Android:layout_marginBottom="10dip"
            Android:text="Messages:"/>

<EditText   Android:id="@+id/messageHistory"
            Android:layout_width="fill_parent"
            Android:layout_height="fill_parent"
            Android:clickable="false"   
            Android:layout_weight="1"
            Android:editable="false"
            Android:gravity="top"
            Android:scrollbars="vertical"
            Android:scrollbarSize="10px"
            /> 

<LinearLayout Android:orientation="horizontal"
              Android:layout_width="fill_parent"
              Android:layout_height="fill_parent"
              Android:layout_weight="4">

        <EditText   Android:id="@+id/message"
                    Android:layout_width="fill_parent"
                    Android:layout_height="fill_parent"
                    Android:gravity="top"
                    Android:layout_weight="1"
                    />

        <Button Android:id="@+id/sendMessageButton"
                Android:layout_width="fill_parent"
                Android:layout_height="fill_parent"
                Android:layout_weight="4"
                Android:text="Send"/>

</LinearLayout>

ご覧のとおり、2つのLinearLayoutがあり、一方が他方に埋め込まれています。これを再現してから、ViewFlipperに追加する必要があります。

これは私がこれまでに持っているものです:

     LinearLayout l1 = new LinearLayout(this);
     LinearLayout l2 = new LinearLayout(this);       
     Button btn=new Button(this);
     EditText messageHistory = new EditText(this);
     EditText newMessage = new EditText(this);
     TextView windowTitle = new TextView(this);     
     btn.setText("Send");
     btn.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 4f));

     btn.setOnClickListener(new OnClickListener() {         
        @Override
        public void onClick(View v) {
                Toast.makeText(getApplicationContext(), "Clicked send in child index: "+ flipper.getDisplayedChild(), Toast.LENGTH_SHORT).show();
            }           
    });

    windowTitle.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
    windowTitle.setPadding(0, 5, 0, 10);
    windowTitle.setText("Chat with: ");

    messageHistory.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
    messageHistory.setGravity(Gravity.TOP);
    messageHistory.setMovementMethod(new ScrollingMovementMethod());
    messageHistory.setClickable(false);
    messageHistory.setFocusable(false);     
    messageHistory.setPadding(0, 0, 0, 5);


    newMessage.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 1f));
    newMessage.setGravity(Gravity.TOP);
    newMessage.setMovementMethod(new ScrollingMovementMethod());
    newMessage.requestFocus();      

    l1.setOrientation(LinearLayout.VERTICAL);
    l1.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
    l2.setOrientation(LinearLayout.HORIZONTAL);
    l2.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

    l1.addView(windowTitle);
    l1.addView(messageHistory);
    l2.addView(newMessage);
    l2.addView(btn);
    l1.addView(l2);
    flipper.addView(l1);

フリッパーは次のように定義されます。

ViewFlipper flipper = (ViewFlipper) findViewById(R.id.viewflip);

問題なく、ロード時にウィンドウに「l1」が表示されますが、l2はどこにも見つかりません。 LayoutParamsを台無しにしましたか? addViewを使用してLinearLayoutを追加できますか?

11
Adam

レイアウトの重みを設定するのを忘れたと思います(私の意見だけですが、間違っている可能性があります)。 layout-heightをFILL_PARENTに設定してビューを追加しているため

10
martinpelant