I need to declare multiple ImageViews with a similair name scheme. I was wondering if there's a way of doing this without a separate line of code for every variable. Right now i'm doing it like this:
ImageView letterView1 = (ImageView) this.findViewById(R.id.letter1);
ImageView letterView2 = (ImageView) this.findViewById(R.id.letter2);
ImageView letterView3 = (ImageView) this.findViewById(R.id.letter3);
ImageView letterView4 = (ImageView) this.findViewById(R.id.letter4);
ImageView letterView5 = (ImageView) this.findViewById(R.id.letter5);
ImageView letterView6 = (ImageView) this.findViewById(R.id.letter6);
ImageView letterView7 = (ImageView) this.findViewById(R.id.letter7);
ImageView letterView8 = (ImageView) this.findViewById(R.id.letter8);
ImageView letterView9 = (ImageView) this.findViewById(R.id.letter9);
ImageView letterView10 = (ImageView) this.findViewById(R.id.letter10);
ImageView letterView11 = (ImageView) this.findViewById(R.id.letter11);
ImageView letterView12 = (ImageView) this.findViewById(R.id.letter12);
ImageView letterView13 = (ImageView) this.findViewById(R.id.letter13);
ImageView letterView14 = (ImageView) this.findViewById(R.id.letter14);
Consider writing
ImageView letterViews = new ImageView[14];
for (int n = 0; n < 14; ++n){
letterViews[n] = (ImageView) this.findViewById(R.id.letters[n]);
}
where I have also anticipating a similar refactoring job on the object to which id is a reference: I've collapsed the fields letter1, letter2, etc. into an array called letters using a declaration similar to that for letterViews.
Note that arrays in Java are zero-based: i.e. one of size 14 is indexed with 0 to 13.
It does seem inefficient that you have declared 14 ImageViews on one page, but if you really need that for your purpose, this code will work fine for you:
for (int i = 1; i <= 14; i++) {
String imageViewId = "letter" + i;
int resId = getResources().getIdentifier(imageViewId, "id", getPackageName());
ImageView imageView = findViewById(resId);
// do what you need to do here
}
P.S. There's probably a better way to do what you need to do instead of declaring 14 ImageViews.
If you can pass "R.id.letterX" as a String: easily:
List<ImageView> views = new ArrayList<ImageView>();
for ( int i = 0; i < length; i++){
views.add((ImageView)this.findViewById("R.id.letter" + (i+1));
}
so, just rewrite your findViewById method to take a String as parameter
If you need a key on every ImageView you can also using a map.
Map<Integer, ImageView> map = new HashMap<>();
for ( int i = 0; i < 14; i++){
map.put(i, (ImageView) this.findViewById("R.id.letter" + (i+1)));
}
And you get your ImageView by key:
ImageView imageView = map.get(1);
Related
This is my code:
ConstraintLayout.LayoutParams buttonParams = new ConstraintLayout.LayoutParams(40,105);
buttonParams.setMargins(8,16,24,32);
secretCodeFields = findViewById(R.id.secretCodeFields);
for (int i = 0; i < 4; i++) {
Button b = new Button(this);
vID[i]=View.generateViewId();
b.setId(vID[i]);
b.setLayoutParams(buttonParams);
secretCodeFields.addView(b);
}
set.clone(secretCodeFields);
set.createHorizontalChain(
secretCodeFields.getId(),ConstraintSet.LEFT,
secretCodeFields.getId(),ConstraintSet.RIGHT,
vID,null,ConstraintSet.CHAIN_PACKED
);
set.applyTo(secretCodeFields);
Buttons are added in the same place (so only last one is visible). The same resultat if I delete "b.setLayoutParams(buttonParams);" line and use
secretCodeFields.addView(b,buttonParams);
But if I add button with width and height params it works, but there are no more margins:
secretCodeFields.addView(b,90,90);
What I do wrong?
EDIT:
secretCodeFields is ConstraintLayout
I found solution. I added margins AFTER set.applyTo... :
for (int i = 0; i < codeLenght; i++) {
Button b = (Button)findViewById(vID[i]);
ConstraintLayout.LayoutParams p = (ConstraintLayout.LayoutParams) b.getLayoutParams();
p.setMargins(6,0,6,0);
b.setLayoutParams(p);
}
It works, but I don't know if it is the best solution.
I know this is a late answer but here it is
the ConstraintSet.CHAIN_PACKED will remove all applied margins to your views
you should first create the chain in Constraint Set then after that apply margins using the ConstrainSet connect(int startID, int startSide, int endID, int endSide, int margin) method to indicate margins.
I'm trying to make a list of database items like the following..
for (int i=0; i < jArray.length(); i++)
{
JSONObject row = jArray.getJSONObject(i);
LinearLayout ll = new LinearLayout(MainActivity.this);
ll.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,100));
Button btn = new Button(MainActivity.this);
//btn.setText(row.getString("subject"));
btn.setText(String.valueOf(i));
btn.setLayoutParams(new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT,(float)0.8));
File imgFile = new File(file_path);
Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
ImageView iv = new ImageView(MainActivity.this);
iv.setScaleType(ImageView.ScaleType.FIT_XY);
iv.setImageBitmap(myBitmap);
iv.setLayoutParams(new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT,(float)0.2));
ll.addView(btn);
ll.addView(iv);
LinearLayout sv = findViewById(R.id.sv_layout);
sv.addView(ll);
}
The result is like this:
But I want to have space between Linear Layouts and make Image height shorter to be equal with button height
How can I achieve this? Thank you,
Please Try this code
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 100);
params.setMargins(0, 5, 5, 10);
ll.setLayoutParams(params);
you can add your specific margins in this line params.setMargins(0, 5, 5, 10);
Take button and image in linear layout with horizontal orientation. Set Button and Imageview height to wrap content. Now for gap between Linear Layouts give appropriate margin.
Set the margins in the layout params and pass them to your ImageView object.
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT,(float)0.2);
int dp = getDps(8);
layoutParams.setMargins(0,dp,0,dp);
iv.setLayoutParams(layoutParams);
Function getDps():
public int getDps(int sizeInDp){
float scale = getResources().getDisplayMetrics().density;
return (int) (sizeInDp*scale + 0.5f);
}
This looks like:
for (int j = 0; j < 2; j++) {
LinearLayout row = new LinearLayout(this);
row.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
LinearLayout underRow = new LinearLayout(this);
underRow.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
for (int i = 0; i < MAX_BUTTONS; i++) {
// String buttonID = "btn" + j + i;
// int resID = getResources().getIdentifier(buttonID, "id","com.project.beacontreetech.doublecheckversion1");
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
button = (Button) getLayoutInflater().inflate(R.layout.button_layout, buttonsContainer, false);
// TextView textView = (TextView) getLayoutInflater().inflate(R.layout.text_view, buttonsContainer,false);
int id1 , id2 ;
id1 = i;
id2 = j;
StringBuilder append = new StringBuilder();
append.append(id1);
append.append(id2);
int imgArrLength = imageList.length;
for ( t=0; t < imgArrLength; t++){
}
String yo = (String.valueOf(append));
int id = Integer.valueOf(String.valueOf(append));
button.setHeight(buttonSize);
button.setWidth(buttonSize);
button.setOnClickListener(this);
button.setId(id);
if (button.getId() == 01){
button.setBackgroundResource(imageList[1]);
}
For set background image for button which is in drawable folder then use below code:
button.setBackgroundResource(R.drawable.new_todo_image);
For set color background you should use this:
button.setBackgroundColor(getResources().getColor(R.color.Green));
your color.xml look like:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<drawable name="red">#f00</drawable>
<drawable name="green">#0f0</drawable>
<drawable name="gray">#ccc</drawable>
</resources>
if (button.getId() == 01){
//to set background image on button
button.setBackgroundResource(R.drawable.your_image);
//or set background color use
button.setBackgroundColor(getResources().getColor(R.color.your_color));
}
on xml layout, I have a FrameLayout with no child. Then I add a list buttons programatically into this framelayout by this code below:
private void addNumbers(){ // Numbers is set with random position
for (int i = 1; i < 20; i++) {
Button btn = new Button(this);
btn.setText("" + i);
btn.setId(i);
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(50, 50);
int leftMargin = new Random().nextInt(widthScreen - btnSize );
int topMargin = new Random().nextInt(heightScreen - btnSize);
lp.leftMargin = leftMargin;
lp.topMargin = topMargin;
btn.setLayoutParams(lp);
framelayout1.addView(btn);
//framelayout2.addView(btn);
}
}
And some buttons overlap together, I do not want to happen this. How to avoid this problem ? Thanks in advance.
P/s: Sorry I can not upload image from my company, all upload > 4K is reject, please tell me if the question is not clear.
In android, I am trying to add buttons programatically, but all the buttons that are added are overlapping. The code I am using is somewhat like this:
for(int i = (int) 'a'; i <= (int) 'z'; i++)
{
Button button = new Button(this);
char letter = (char)i;
String letterOnButton = Character.toString(letter);
button.setText(letterOnButton);
RelativeLayout rl = (RelativeLayout)findViewById(R.id.dynbuttons);
LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
rl.addView(button,lp);
}
It does not throw a button, but I only get to see the "z" button.
Any idea on how to fix this?
As mentioned above LinearLayout would be the best solution, but if u still want to use RelativeLayout, try setting an id to each button and inflate the subsequent with the parameter RIGHT_OF/BELOW..as suggested above, parameter "layout_alignLeft" will produce the same effect, i.e inflate all buttons in the same position
RelativeLayout rl = (RelativeLayout) findViewById(R.id.layout);
int id = 0;
for (int i = (int) 'a'; i <= (int) 'z'; i++) {
Button button = new Button(this);
char letter = (char) i;
String letterOnButton = Character.toString(letter);
button.setText(letterOnButton);
button.setId(i);
LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.BELOW, id);
rl.addView(button, lp);
id = i;
}
I would go with a LinearLayout instead of a RelativeLayout, something like this:
LinearLayout ll = (LinearLayout)findViewById(R.id.dynbuttons);
LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
for(int i = (int) 'a'; i <= (int) 'z'; i++) {
Button button = new Button(this);
char letter = (char)i;
String letterOnButton = Character.toString(letter);
button.setText(letterOnButton);
ll.addView(button,lp);
}
If you still want to use a RelativeLayout you have to set the parameter layout_alignLeft for each button.