0

目的のレイアウトの画像:

ここに画像の説明を入力してください私は次の状況にあります:

データベースから入力されたボタンを含むグループがあります(たとえば、特定のテーブルの10個のアイテムがこのグループの10個のボタンに入力されます)-これは正常に機能します。

方法がわからない部分は次のとおりです。

  • このボタンが円(描画可能)として表示され、その円の中に画像(パスはデータベースから取得されます)と上記の説明のラベル(表から)が表示されるようにしたいと思います。

  • アイテムが1つある場合、それは画面の中央にあり、ボタンの量が増えるにつれて、円は3列のグリッド内に設定されます。

誰かがこの問題で私を助けることができますか?

異なるメソッド(RadioButtonsを使用)を試した古いバージョンでは、この例ではImageまたはdrawableはなく、アイテムはRadioGroup内のradioButtonsです。

DatBas dbc = new DatBas(Tamar_appActivity.this);
    dbc.open();
    SQLiteDatabase tdb = dbc.getDatabase();
    String[] columns = new String[] { DatBas.KEY_ROW_B_ID,
            DatBas.KEY_B_NAME };
    Cursor c = tdb.query(DatBas.DATABASE_TABLE_SETTINGS, columns, null,
            null, null, null, null);

    int iRawBId = c.getColumnIndex(DatBas.KEY_ROW_ID);
    int iBName = c.getColumnIndex(DatBas.KEY_B_NAME);

    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {

        RadioGroup radiogroup = (RadioGroup)   
                    findViewById(R.id.bNameSelectGroup);
        final Button rdbtn = new Button(this);

        rdbtn.setId(iRawBId);
        rdbtn.setText(c.getString(iBName));
        radiogroup.addView(rdbtn);
    }
    dbc.close();

}

これはSpacialButton.javaコードです:

public class SpecialButton extends RelativeLayout {

public TextView text;
//public ImageView image;

public SpecialButton(Context context) {
    super(context);
    this.setBackgroundResource(R.drawable.cb_shape);
    LayoutInflater.from(context).inflate(R.layout.cb_inner,
            this, true);
    text = (TextView) findViewById(R.id.textView1);
//    image = (ImageView) findViewById(R.id.imageBB);
}

public SpecialButton(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public SpecialButton(Context context, AttributeSet attrs) {
    super(context, attrs);
}

}

これはcb_inner.xmlコードです:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- This will hold the image from the database -->
    <ImageView
        android:id="@+id/imageBB"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true" />

    <View
        android:id="@+id/anchor"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_centerInParent="true" />

    <!-- This will be the label. It will be placed below the center -->
    <TextView
        android:id="@+id/cbTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/anchor"
        android:layout_centerHorizontal="true"
        android:text="TextView"
        android:textColor="#000000" />

</merge>

これはMain.javaコードです:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        TableLayout tl = (TableLayout) findViewById(R.id.grid);
            Display display2 = getWindowManager().getDefaultDisplay(); 
            int width = display2.getWidth();  
            int height = display2.getHeight(); 
            int realSize = width / 3;


        DatBas dbc = new DatBas(Tamar_appActivity.this);
        dbc.open();
        SQLiteDatabase tdb = dbc.getDatabase();
        String[] columns = new String[] { DatBas.KEY_ROW_B_ID,
                DatBas.KEY_B_NAME };
        Cursor c = tdb.query(DatBas.DATABASE_TABLE_SETTINGS, columns, null,
                null, null, null, null);
        c.moveToFirst();
        int iRawBId = c.getColumnIndex(DatBas.KEY_ROW_B_ID);
        int iBName = c.getColumnIndex(DatBas.KEY_B_NAME);
        int iBimage = c.getColumnIndex(DatBas.KEY_B_IMAGE_PATH);
//      ic_launcher.png
        int cursorSize = c.getCount();
        int rows = (cursorSize / 3) + 1; // +1 so you have at least one row if the number of button is below 3
        int current = 1; // starting position
        for (int i = 0; i < rows; i++) {
            TableRow tr1 = new TableRow(this);
            tr1.setLayoutParams(new TableLayout.LayoutParams(
                    TableLayout.LayoutParams.FILL_PARENT,
                    TableLayout.LayoutParams.WRAP_CONTENT));
            for (int j = 0; j < 3; j++) {
                if (current <= cursorSize) {
                    SpecialButton sb = new SpecialButton(this);
                    sb.text.setText(c.getString(iBName));
                    sb.setLayoutParams(new TableRow.LayoutParams(realSize,
                            realSize));
                    // other stuff you would do
//                  sb.image.getDrawable();
                    tr1.addView(sb);
                    c.moveToNext();
                }
                current++;
            }
            tl.addView(tr1);
        }
        dbc.close();

    }
4

1 に答える 1

0

このボタンが円 (描画可能) として表示され、その円内に画像 (パスはデータベースから取得されます) と上記の説明のラベル (表から) があることを望みます。

すべての項目をシミュレートするレイアウト ファイルを作成することをお勧めします。

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- This will hold the image from the database -->
    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true" />

    <View
        android:id="@+id/anchor"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_centerInParent="true" />

    <!-- This will be the label. It will be placed below the center -->
    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/anchor"
        android:layout_centerHorizontal="true"
        android:text="TextView"
        android:textColor="#000000" />

</merge>

上記item_backgroundで使用されるドローアブル:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval" >

    <solid android:color="#92c47d" />

    <stroke
        android:width="2dp"
        android:color="#000000" />

</shape>

次に、簡単に処理できるように、これをカスタムViewクラスに配置することをお勧めします。

    public class SpecialButton extends RelativeLayout {

    public TextView text;
    public ImageView image;

    public SpecialButton(Context context) {
        super(context);
        this.setBackgroundResource(R.drawable.item_background1);
        LayoutInflater.from(context).inflate(R.layout.views_special_btn_layout,
                this, true);
        text = (TextView) findViewById(R.id.textView1);
        image = (ImageView) findViewById(R.id.image);
    }

    public SpecialButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public SpecialButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

}

をシミュレートするには、上記のカスタム ビューにButton追加します。OnCLickListener(私の知る限り)xmlドローアブルで円を作成する方法はないため、View上記のカスタムの正確なサイズ( の値など100dp)がない場合は、コードで計算する必要があります。また、TextView ラベルを特定の位置に配置する場合は、コードで再度行う必要があります。ボタンを画面にどのように配置するか正確にはわかりませんが、通常は画面の幅と高さを調べて、そこから実際の寸法を計算します。

// in the onCreate method
Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();  
int height = display.getHeight(); 
// here I assumed you have only 3 buttons and you want them to be placed taking all
// the width of the screen(of course this isn't ideal because if the user turns the
// phone, in landscape, you'll end up with 3 really big buttons so you may want to   
// set a default size for the buttons )
int realSize = width / 3; 
Cursor c = tdb.query(DatBas.DATABASE_TABLE_SETTINGS, columns, null,
            null, null, null, null);
    int iRawBId = c.getColumnIndex(DatBas.KEY_ROW_ID);
    int iBName = c.getColumnIndex(DatBas.KEY_B_NAME);
    int cursorSize = c.getCount();
    int rows = (cursorSize / 3) + 1; // +1 so you have at least one row if the number of button is below 3
    int current = 1; // starting position
    for (int i = 0; i < rows; i++) {
        TableRow tr = new TableRow(this);
        tr.setLayoutParams(new TableLayout.LayoutParams(
                TableLayout.LayoutParams.FILL_PARENT,
                TableLayout.LayoutParams.WRAP_CONTENT));
        for (int j = 0; j < 3; j++) {
            if (current <= cursorSize) {
                SpecialButton sb = new SpecialButton(this);
                sb.text.setText(c.getString(iBName));
                sb.setLayoutParams(new TableRow.LayoutParams(realSize,
                        realSize));
                // other stuff you would do
                tr.addView(sb);
                c.moveToNext();
            }
            current++;
        }
        tl.addView(tr);
    }

アイテムが1つある場合は画面の中央に配置され、ボタンの数が増えるにつれて、円は3列のグリッド内に設定されます。

あなたの現在のレイアウトはわかりませんが、これは次のようなレイアウトで非常に簡単に実行できます(アイテムを に配置すると仮定しましたTableLayout):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <TableLayout
        android:id="@+id/grid"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    </TableLayout>

</LinearLayout>

次に、要素をコードに配置し(各3つのアイテムを a にTableRowgravity 、親LinearLayout属性の要素を中央に配置する必要があります。GridViewa の代わりに a を使用することもできTableLayoutますが、項目を中央に配置するために一生懸命作業する必要があります。上記の 3 つのボタンの例:

       // in the onCreate method
       tl = (TableLayout) findViewById(R.id.grid);
        Display display = getWindowManager().getDefaultDisplay(); 
        int width = display.getWidth();  
        int height = display.getHeight(); 
        int realSize = width / 3;
        TableRow tr = new TableRow(this);
        tr.setLayoutParams(new TableLayout.LayoutParams(
                TableLayout.LayoutParams.FILL_PARENT,
                TableLayout.LayoutParams.WRAP_CONTENT));
        SpecialButton sb1 = new SpecialButton(this);
        sb1.setLayoutParams(new TableRow.LayoutParams(realSize, realSize));
        SpecialButton sb2 = new SpecialButton(this);
        sb2.setLayoutParams(new TableRow.LayoutParams(realSize, realSize));
        SpecialButton sb3 = new SpecialButton(this);
        sb3.setLayoutParams(new TableRow.LayoutParams(realSize, realSize));
        tr.addView(sb1);
        tr.addView(sb2);
        tr.addView(sb3);
        tl.addView(tr);
于 2012-05-31T18:33:41.703 に答える