web-dev-qa-db-ja.com

AndroidアプリケーションのGridViewにボタンの配列を追加します

バックエンドから何が利用できるかに応じて5〜15個のボタンを持つアプリケーションがあります。適切なGridViewレイアウトファイルを定義して、テキストやその他の属性がそれぞれ異なるボタンの配列を含めるにはどうすればよいですか?各ボタンは基本的にカートにアイテムを追加するため、カートに追加するアイテムを除いて、onClickコードは同じです。

配列を定義して、可変数のボタンを追加しながら、それぞれのIDを一意のIDで参照できるようにするにはどうすればよいですか? arrays.xml の例を見てきましたが、事前に設定された文字列の配列が作成されています。オブジェクトを作成し、レイアウトまたは配列のxmlファイルでテキストを定義しない方法が必要です。

更新-GridViewへの追加に関する情報が追加されました

これをGridViewに追加したいので、[addViewメソッド]( http://developer.Android.com/reference/Android/widget/AdapterView.html#addView(Android.view.View、% 20int) UnsupportedOperationExceptionが発生します。次のことができます。

ImageButton b2 = new ImageButton(getApplicationContext());
b2.setBackgroundResource(R.drawable.img_3);
Android.widget.LinearLayout container = (Android.widget.LinearLayout) findViewById(R.id.lay);
container.addView(b2);

しかし、それは私が望むようにボタンをグリッドに配置しません。これはGridViewで実行できますか?

16
Tai Squared

次のコードでは、forの上限を変数に変更する必要があります。

public class MainActivity
        extends Activity
        implements View.OnClickListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        TableLayout layout = new TableLayout (this);
        layout.setLayoutParams( new TableLayout.LayoutParams(4,5) );

        layout.setPadding(1,1,1,1);

        for (int f=0; f<=13; f++) {
            TableRow tr = new TableRow(this);
            for (int c=0; c<=9; c++) {
                Button b = new Button (this);
                b.setText(""+f+c);
                b.setTextSize(10.0f);
                b.setTextColor(Color.rgb( 100, 200, 200));
                b.setOnClickListener(this);
                tr.addView(b, 30,30);
            } // for
            layout.addView(tr);
        } // for

        super.setContentView(layout);
    } // ()

    public void onClick(View view) {
        ((Button) view).setText("*");
        ((Button) view).setEnabled(false);
    }
} // class
23
cibercitizen1

ここにあなたのための素晴らしいサンプルがあります:

https://developer.Android.com/guide/topics/ui/layout/gridview.html

GetViewアダプターメソッドで、イメージビューの代わりにボタンを作成するだけです。

14
Fedor

GridView、またはListView(etc)を使用していて、アダプタを介してビューを生成するビューを生成している場合getView(pos、convertView、viewGroup)、あなたは混乱に遭遇するかもしれません(私は一度行った)。

ConvertViewパラメータを再利用する場合は、その内部でeverythingをリセットする必要があります。これは、レイアウトを拡張するコストを節約するために、フレームワークによって渡される古いビューです。それは以前にレイアウトにあったpositionと関連付けられることはほとんどありません。

class GridAdapter extends BaseAdapter // assigned to your GridView
{
    public View getView(int position, View convertView, ViewGroup arg2) {
        View view;
        if (convertView==null)
        {
            view = getLayoutInflater().inflate(R.layout.Gd_grid_cell, null);
        }
        else
        {
             // reusing this view saves inflate cost
             // but you really have to restore everything within it to the state you want
            view = convertView;
        }


        return view;
    }
    //  other methods omitted (e.g. getCount, etc) 
}

これはこれらのAndroid概念が最初に把握するのが少し難しいものの1つを表していると思います)モバイル機器)

9
alienjazzcat

次のコードでは、forの上限を変数に変更する必要があります。

public class MainActivity
        extends Activity
        implements View.OnClickListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        TableLayout layout = new TableLayout (this);
        layout.setLayoutParams( new TableLayout.LayoutParams(4,5) );

        layout.setPadding(1,1,1,1);

        for (int f=0; f<=13; f++) {
            TableRow tr = new TableRow(this);
            for (int c=0; c<=9; c++) {
                Button b = new Button (this);
                b.setText(""+f+c);
                b.setTextSize(10.0f);
                b.setTextColor(Color.rgb( 100, 200, 200));
                b.setOnClickListener(this);
                tr.addView(b, 30,30);
            } // for
            layout.addView(tr);
        } // for

        super.setContentView(layout);
    } // ()

    public void onClick(View view) {
        ((Button) view).setText("*");
        ((Button) view).setEnabled(false);
    }
} 
1
james james