I have a GridLayout in which I want Buttons to be generated dynamically. I have specified the number of rows & columns of the GridLayout in XML. I want the generated buttons to occupy even amount of space in the GridLayout.
That is to say, if I have three columns, all three buttons should occupy same space. Now I have seen a few examples here on StackOverflow that suggest making use of android:layout_width, but none of them contain examples of dynamically generated Views & I don't know if and how layout_width can be added to a View component like Button.
I want my GridLayout to look like this, but all I'm getting is this
Following is the XML that contains GridLayout
<GridLayout
android:id="#+id/gridLayout"
android:layout_marginTop="30dp"
android:layout_gravity="center"
android:background="#android:color/holo_blue_light"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:columnCount="2"
android:rowCount="2"
android:columnOrderPreserved="true"
android:scrollbars="vertical">
</GridLayout>
Following is the dynamic generation of Buttons
netbankingGrid = (GridLayout) findViewById(R.id.gridLayout);
//First Cell on the Grid
{
Button button1 = new Button(this);
button1.setText("Button1");
Drawable image = getApplicationContext().getResources().getDrawable(R.drawable.ar_hdfc);
image.setBounds(0,0,70,70);
button1.setCompoundDrawables(null,image,null, null);
button1.setBackgroundResource(R.drawable.custom_bg1);
netbankingGrid.addView(button1);
}
//Second Cell on the Grid
{
Button button2 = new Button(this);
button2.setText("Button2");
Drawable image = getApplicationContext().getResources().getDrawable(R.drawable.ar_hdfc);
image.setBounds(0,0,70,70);
button2.setCompoundDrawables(null,image,null, null);
button2.setBackgroundResource(R.drawable.custom_bg2);
netbankingGrid.addView(button2);
}
//Third Cell on the Grid
{
Button button3 = new Button(this);
button3.setText("Button3");
Drawable image = getApplicationContext().getResources().getDrawable(R.drawable.ar_hdfc);
image.setBounds(0,0,70,70);
button3.setCompoundDrawables(null,image,null, null);
button3.setBackgroundResource(R.drawable.custom_bg3);
netbankingGrid.addView(button3);
}
//Fourth Cell on the Grid
{
Button button4 = new Button(this);
button4.setText("Button4");
Drawable image = getApplicationContext().getResources().getDrawable(R.drawable.ar_hdfc);
image.setBounds(0,0,70,70);
button4.setCompoundDrawables(null,image,null, null);
button4.setBackgroundResource(R.drawable.custom_bg4);
netbankingGrid.addView(button4);
}
Thank you for your time!
Related
I am trying to make a game with multiple levels. My plan is to print 15 levels on 1 page. I have attached a photo of the simple design I am currently using.
As you can see in the picture the right border of a button is not showing. For the parent I am using this java code:
LinearLayout horl = new LinearLayout(this);
horl.setId(worldVar);
horl.setOrientation(LinearLayout.HORIZONTAL);
horl.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
And to set 3 buttons horizontally in this LinearLayout I use this code for the buttons. This code just has a simple for loop around to put 3 buttons in this LinearLayout:
Button button = new Button(this);
LinearLayout.LayoutParams params = new LinearLayout
.LayoutParams(getMarginInDp(100), getMarginInDp(100));
params.setMargins(getMarginInDp(1), getMarginInDp(25), getMarginInDp(1), 0);
button.setLayoutParams(params);
GradientDrawable gd = new GradientDrawable();
gd.setCornerRadius(5);
gd.setStroke(1, 0xFF000000);horl.addView(button);
The function getMarginInDp looks like this:
public int getMarginInDp(int dp){
return (int) TypedValue
.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());
}
Does anybody have any idea how to make the border appear because I want to keep the buttons approximately this size and I may even slightly increase the margins?
You can set the weight to 0.33f for each button:
Button button = new Button(this);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(getMarginInDp(100), getMarginInDp(100), 0.33f);
so they are distributed equally in the width of the layout.
I got a problem with my for loop / with its content.
I want to have this loop in which an image is repeated n times.
In addition these images should have margins at the top so they have some space between each other.
For now these images are laying on top of each other or won't be generated as they should (Result: Drawable "bg_circle" is only displayed once).
The "userinput" will be filled from an EditText in an Alert Dialog.
Here is my code:
int n = Integer.parseInt(userInput.getText().toString());
RelativeLayout layout = findViewById(R.id.TableView);
for(int i = 0; i <= n; i++){
ImageView image = new ImageView(mContext);
image.setImageResource(R.drawable.bg_circle);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(100,100,0,0);
lp.height = 100;
lp.width = 100;
image.setLayoutParams(lp);
layout.addView(image);
}
Where is the mistake?
Use LinearLayout with vertical orientation instead of RelativeLayout. Also, you should use a ScrollView as root element of the layout:
<ScrollView ...>
<LinearLayout android:orientation="vertical" ...>
... programmatically added images...
</LinearLayout>
</ScrollView>
I have a tabWidget defined as:
<TabWidget
android:layout_alignParentBottom="true"
android:id="#android:id/tabs"
android:paddingBottom="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center|bottom"
android:weightSum="5"
android:background="#drawable/bottom_bar_without_bg"
/>
Now I am adding custom ImageViews in it:
Drawable d = getResources().getDrawable(R.drawable.tabbar_button_home);
ImageView img1 = new ImageView(this);
img1.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
img1.setImageDrawable(d);
TabHost.TabSpec tSpecHome = tHost.newTabSpec("timeline");
tSpecHome.setIndicator(img1);
tSpecHome.setContent(new MyTabContent(getBaseContext()));
tHost.addTab(tSpecHome);
The problem with this code is that all the images are spaced with each other in middle.
e.g abcdef
I want them to stretch to full width and have space in between them e.g a b c d e
Update the code as follows:
Drawable d = getResources().getDrawable(R.drawable.tabbar_button_home);
ImageView img1 = new ImageView(this);
img1.setLayoutParams(new LayoutParams(0, LayoutParams.WRAP_CONTENT, 1.0f)); // this line changed
img1.setImageDrawable(d);
Explanation:
The third parameter in the LayoutParams constructor is the weight. Each image view now has a weight of 1.0f. So they will spread across the layout.
You have them with WRAP_CONTENT width.
Instead they should be set to a width of 0dp and each one have a layout gravity of 1.
I have a Table Layout defined within LinearLayout as follows:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:background="#E6E6E6"
android:orientation="vertical" >
<TableLayout
android:id="#+id/fbTableLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:background="#android:color/darker_gray"
android:stretchColumns="*" >
</TableLayout>
</LinearLayout>
I am adding dynamic rows to the TableLayout as follows:
fbTableLayout = (TableLayout) findViewById(R.id.fbTableLayout);
for (int i = 0; i < 4; i++) {
fbTableRow = new TableRow(this);
fbTableRow.setBackgroundColor(Color.WHITE);
LayoutParams layoutParams = new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
int leftMargin=10;
int topMargin=2;
int rightMargin=10;
int bottomMargin=2;
layoutParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin);
fbTableRow.setLayoutParams(layoutParams);
ImageView iv = new ImageView(this);
iv.setBackgroundDrawable(getResources().getDrawable(
R.drawable.ic_launcher));
iv.setLayoutParams(new LayoutParams(0, LayoutParams.WRAP_CONTENT,
0.25f));
TextView tv = new TextView(this);
tv.setText("Album "+ i);
tv.setLayoutParams(new LayoutParams(0, LayoutParams.WRAP_CONTENT,
0.75f));
fbTableRow.addView(iv);
fbTableRow.addView(tv);
fbTableLayout.addView(fbTableRow, new TableLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
}
But I am not able to generate spaces between the rows generated. The layout is as shown in the figure attached.
I have gone through a number of solutions given in stackoverflow to resolve this issue but none of them are working for me. Not sure what I am missing.
Any help would be greatly appreciated.
Thanks in advance.
Add another table row (in the loop) with a blank image. Specify the size of the image to create the size needed for your space.
Have you tried this when you're adding the table row?
fbTableLayout.addView(fbTableRow, layoutParams);
If not, you can try setting the margins on the individual views within the table row, but I'm pretty sure the above should apply the layout params when the row is being added to the table layout.
The docs for the setMargins method include this note:
A call to requestLayout() needs to be done so that the new margins are taken into account. Left and right margins may be overriden by requestLayout() depending on layout direction.
...so one thing to try would be to call fbTableLayout.requestLayout() after you've added all the rows. This probably won't make a difference, since the view should be getting invalidated in the code you've already posted, but it wouldn't hurt to try.
If that doesn't work, you could use another viewgroup (e.g. a FrameLayout) within each table row to contain your ImageView and TextView and set your padding there.
I want to create an input box with a submit button to the right. Between them they should span the width of the screen. Currently I have:
LinearLayout row= new LinearLayout(context);
row.setOrientation(HORIZONTAL);
row.setGravity(Gravity.RIGHT);
EditText input = new EditText(context);
Button submit = new Button(context);
submit.setText("Submit");
row.addView(submit);
row.addView(input,LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
myView.addView(row,LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
This results in the correct distribution of space: The submit button taking up as much space as it needs, the input button taking up the remaining space, however they are the wrong way round (the submit button is on the left, despite setting the gravity). If I take away the gravity, and reverse the order of adding the elements to the row, the input box takes up the whole width of the screen, and the submit button is not visible. What am I doing wrong?
I'd say it is better to use relative layout and place input to left of the button. But if you really need this with Linear layout you can just use weight parameter:
LinearLayout row= new LinearLayout(context);
EditText input = new EditText(context);
Button submit = new Button(context);
submit.setText("Submit");
LayoutParams inputParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
inputParams.weight = 1;
row.addView(input,inputParams);
LayoutParams buttonParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
buttonParams.weight = 0;
row.addView(submit, buttonParams);
Try adding EditText first setting its width to fill parent and its weight to 1, then the button (width = wrap content)
Items stack in a LinearLayout in the order in which you added them. Switch your two addView calls.
Its typically easier to achieve the right layout with the layout xml files. I.e:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
If you also need to line up buttons on the next line, you can also use a TableLayout. Look at the apidemos for code sample.