Androidの動的レイアウトで悩んでいます。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
XEGA

Androidの動的レイアウトで悩んでいます。

#1

投稿記事 by XEGA » 12年前

いつもお世話になっています。
電子書籍ビューワ等によくある本棚を作ろうとしているのですが、レイアウトで詰まっています。
本の表紙となる画像を左から右へ追加していき、画面端まで追加すると下の段の右からまた追加されるという動作を実装したいのですが、
どのような方法があるでしょうか。

コード:

package xega.test.layout_test_01;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

import android.widget.Toast;

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // レイアウトXMLをセット
        setContentView(R.layout.activity_main);

        // レイアウトXMLで指定したボタン(button)を作成
        Button button = (Button)this.findViewById(R.id.main_button);

        // 別途定義したクラス(Counter)を作成
        final Counter counter = new Counter();

        // ボタンに(setOnClickListener)を追加することで押下した際に(onClick)が呼ばれる
        button.setOnClickListener(new View.OnClickListener() {

            // ボタンを押下した際の処理
            @Override
            public void onClick(View v) {

                // (LinearLayout)にレイアウトXMLの(LinearLayout)のidを指定
                LinearLayout layout = (LinearLayout)findViewById(R.id.top_layout);

                // (TextView)を別途定義レイアウトXMLから作成する
                TextView newText = (TextView)getLayoutInflater().inflate(R.layout.add, null);
                // 作成した(TextView)にテキストをセットする
                newText.setId(counter.count());
                newText.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_launcher,0,0,0);
                // (layout)に作成した(TextView)を追加
                // 結果、メインレイアウトに別途定義したレイアウトが追加される
                layout.addView(newText);
            }
        });
    }

    public void textView_onClick(View v){
        Toast ts = Toast.makeText(this, String.valueOf(v.getId()), Toast.LENGTH_SHORT);
        ts.show();
    }

    // IDを振るためのカウンター
    private class Counter {
        private int count = 0;
        public int count() {
            return this.count++;
        }
    }
}

現在は試行錯誤でメインレイアウト(LinearLayout:horizontal)に別途定義したTextViewに画像を突っ込んで横に並べているのですが、
改行等の実装方法がよく分かっていません。
他に簡単な方法があれば、是非ご教授よろしくお願い致します。

XEGA

LinearLayoutの追加方法

#2

投稿記事 by XEGA » 12年前

XMLにverticalで用意したLinearLayoutに、動的に生成したhorizontalのLinearLayoutを追加すれば段数を増やせるのではないかと思うのですが、
動的に生成したLinearLayoutをXMLに用意したLinearLayoutに追加するにはどうすればよいでしょうか。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: Androidの動的レイアウトで悩んでいます。

#3

投稿記事 by ISLe » 12年前

addViewメソッドでViewを追加できます。

XEGA

LinearLayoutの追加について

#4

投稿記事 by XEGA » 12年前

LinearLayoutにaddViewで任意のレイアウトを追加していきたいのですが、まだ上手く動きません。

コード:

// (LinearLayout)にレイアウトXMLの(LinearLayout)のidを指定
        final LinearLayout layout = (LinearLayout)findViewById(R.id.top_layout);

        final LinearLayout layout_01 = new LinearLayout(this);
        final LinearLayout layout_02 = new LinearLayout(this);
        layout_01.setOrientation(LinearLayout.HORIZONTAL);
        layout_02.setOrientation(LinearLayout.HORIZONTAL);

        layout.addView(layout_01);
        layout.addView(layout_02);

        // ボタンに(setOnClickListener)を追加することで押下した際に(onClick)が呼ばれる
        add_button.setOnClickListener(new View.OnClickListener() {

            // ボタンを押下した際の処理
            @Override
            public void onClick(View v) {

                // (LayoutInflater)によりViewを追加する
                LayoutInflater inflater = getLayoutInflater();
                LayoutInflater inflater_02 = getLayoutInflater();


                // 追加するレイアウトXMLを指定
                LinearLayout incLayout = (LinearLayout)inflater.inflate(R.layout.add, null);
                LinearLayout incLayout_02 = (LinearLayout)inflater_02.inflate(R.layout.add, null);

                // (TextView)を別途定義レイアウトXMLから作成する
                // レイアウトXML内に(TextView)のみ存在する場合は(R.layout)により指定可能
                TextView cover_text = (TextView)incLayout.findViewById(R.id.book_cover);
                TextView cover_text_02 = (TextView)incLayout_02.findViewById(R.id.book_cover);

                cover_text.setText("伊豆の踊子" + counter.count());
                cover_text_02.setText("伊豆の踊子" + counter.count);

                Drawable cover = getResources().getDrawable(R.drawable.book_cover);
                cover.setBounds(0,0,cover.getIntrinsicWidth() / 5,cover.getIntrinsicHeight() / 5);

                cover_text.setCompoundDrawables(null,cover,null,null);
                cover_text_02.setCompoundDrawables(null,cover,null,null);

                layout_01.addView(incLayout);
                layout_02.addView(incLayout_02);
            }
        });
上記のコードで、XMLに定義したverticalのLinearLayoutに生成した2つのhorizontalのLinearLayoutを追加できると思ったのですが…。
どんな方法があるのでしょうか。

XEGA

だいぶ近づきましたが…。

#5

投稿記事 by XEGA » 12年前

XMLを諦めて全てのGroupViewを生成することで、だいぶいい感じになってきました。
しかしこのコードだと、最初から決まった個数のLinearLayoutを用意しておかなければなりません。
LinearLayout自体を必要になる度に生成するにはどうすればよいのでしょうか。

コード:

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // LinearLayout:verticalを生成
        LinearLayout layout = new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);

        // (setcontentView)に(layout)をセット
        setContentView(layout);

        Button add_button = new Button(this);
        layout.addView(add_button);

        // 行となる(LinearLayout:horizontal)を2つ生成
        final LinearLayout layout_01 = new LinearLayout(this);
        final LinearLayout layout_02 = new LinearLayout(this);

        layout_01.setOrientation(LinearLayout.HORIZONTAL);
        layout_02.setOrientation(LinearLayout.HORIZONTAL);

        // メインレイアウトにそれぞれ追加
        layout.addView(layout_01);
        layout.addView(layout_02);

        // ボタンに(setOnClickListener)を追加することで押下した際に(onClick)が呼ばれる
        add_button.setOnClickListener(new View.OnClickListener() {

            // ボタンを押下した際の処理
            @Override
            public void onClick(View v) {

                // (LayoutInflater)によりViewを追加する
                LayoutInflater inflater = getLayoutInflater();
                LayoutInflater inflater_02 = getLayoutInflater();

                // 追加するレイアウトXMLを指定
                LinearLayout incLayout = (LinearLayout)inflater.inflate(R.layout.add, null);
                LinearLayout incLayout_02 = (LinearLayout)inflater_02.inflate(R.layout.add, null);

                // (TextView)を別途定義レイアウトXMLから作成する
                // レイアウトXML内に(TextView)のみ存在する場合は(R.layout)により指定可能
                TextView cover_text = (TextView)incLayout.findViewById(R.id.book_cover);
                TextView cover_text_02 = (TextView)incLayout_02.findViewById(R.id.book_cover);

                cover_text.setText("伊豆の踊子");
                cover_text_02.setText("死刑執行中");

                Drawable cover = getResources().getDrawable(R.drawable.book_cover);
                Drawable cover_02 = getResources().getDrawable(R.drawable.book_cover_02);
                cover.setBounds(0,0,cover.getIntrinsicWidth() / 2,cover.getIntrinsicHeight() / 2);
                cover_02.setBounds(0,0,cover.getIntrinsicWidth() / 2,cover.getIntrinsicHeight() / 2);

                cover_text.setCompoundDrawables(null,cover,null,null);
                cover_text_02.setCompoundDrawables(null,cover_02,null,null);

                layout_01.addView(incLayout);
                layout_02.addView(incLayout_02);
            }
        });
    }
}
ご教授をよろしくお願い致します。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: Androidの動的レイアウトで悩んでいます。

#6

投稿記事 by ISLe » 12年前

Layoutは入れ子にできるので、ベースのLayoutの中にLinearLayoutを定義しておけば複数並べることができると思いますが。

具体的な質問にしか回答できません。

閉鎖

“C言語何でも質問掲示板” へ戻る