The ArrayList doesn't show in layout - java

I am trying to add items to array dynamically and then add these items in array of textviews but the layout doesn't show me any item. I need to know what is wrong with my code. Thanks in advance.
TextView[] tt;
LinearLayout testy;
List<String> x = new ArrayList<String>(99);
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
testy=(LinearLayout) findViewById(R.id.testy);
tt=new TextView[100];
LinearLayout.LayoutParams dim=new
LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
x.add("hii");
for(int i=1;i<x.size();i++)
{
tt[i]=new TextView(this);
tt[i].setLayoutParams(dim);
x.add(i,"hello");
String data=x.get(i);
tt[i].setText(data);
testy.addView(tt[i]);
}
setContentView(testy);
}

You have only 1 item in your array list (which has an index of 0) but your loop starts at 1 which skips the whole for loop because 1<1 is false

R.layout.activity_test is a layout file that controls are how to display how to display the display interface of setContentView is to set a Activity, this sentence is the sentence and then set the Activity using main layout file under R.layout layout
remove this
setContentView(testy);
Edit
Try this .
TextView[] tt;
LinearLayout testy;
List<String> x = new ArrayList<String>(100);
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
testy = (LinearLayout) findViewById(R.id.testy);
tt = new TextView[100];
LinearLayout.LayoutParams dim = new
LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
for (int i = 0; i < x.size(); i++) {
tt[i] = new TextView(this);
tt[i].setLayoutParams(dim);
x.add(i, "hello");
String data = x.get(i);
tt[i].setText(data);
testy.addView(tt[i]);
}
}

Replace
for(int i=1;i<x.size();i++)
{
tt[i]=new TextView(this);
tt[i].setLayoutParams(dim);
x.add(i,"hello");
String data=x.get(i);
tt[i].setText(data);
testy.addView(tt[i]);
}
By
for(int i=0;i<tt.length;i++)
{
tt[i]=new TextView(this);
tt[i].setLayoutParams(dim);
x.add(i,"hello");
String data=x.get(i);
tt[i].setText(data);
testy.addView(tt[i]);
}
And
List<String> x = new ArrayList<String>(99);
By
List<String> x = new ArrayList<String>(100);

Related

How do you put dynamically loaded radio buttons into a group?

Radio buttons are supposed to be mutually exclusive. But they need to be in a "radio group."
According to the docs, "By grouping them together, the system ensures that only one radio button can be selected at a time."
I made some radio buttons (dynamically loaded) and I made sure to put them in a group. However, they are not mutually exclusive and I can check all of them at once.
How do I fix this?
Here is the code:
public class MainActivity extends AppCompatActivity {
private LinearLayout candidatesLayout;
private String[] candidates = {"Smith","Johnson","Williams","Brown","Jones","Garcia","Miller","Davis","Rodriguez","Martinez"};
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
candidatesLayout = (LinearLayout) findViewById(R.id.candidatesLayout);
final int N = candidates.length; // total number of textviews to add
final TextView[] myTextViews = new TextView[N]; // create an empty array;
for (int i = 0; i < N; i++) {
// create a new textview
final TextView rowTextView = new TextView(this); //rowTextView is persons name
//create horizonal parent for radio buttons
LinearLayout radioButtons = new LinearLayout(this);
LinearLayout numbers = new LinearLayout(this);
radioButtons.setOrientation(LinearLayout.HORIZONTAL);
//create new radio buttons
final RadioGroup radioGroup = new RadioGroup(this);
RadioButton button;
for(int ii = 0; ii < N; ii++) {
button = new RadioButton(this); //I should not be able to click more than one of these!
radioButtons.addView(button);
}
candidatesLayout.addView(rowTextView);
candidatesLayout.addView(radioButtons);
}
}
}
I am guessing that they are not really in the group that I think they are in.
You have created RadioGroup, but didn't add it to the layout.
So, replace radio buttons adding with the following snippet:
for (int i = 0; i < N; i++) {
// create a new textview
final TextView rowTextView = new TextView(this); //rowTextView is persons name
//create horizonal parent for radio buttons
LinearLayout radioButtons = new LinearLayout(this);
LinearLayout numbers = new LinearLayout(this);
radioButtons.setOrientation(LinearLayout.HORIZONTAL);
//create new radio buttons
final RadioGroup radioGroup = new RadioGroup(this);
RadioButton button;
for(int ii = 0; ii < N; ii++) {
button = new RadioButton(this);
radioGroup.addView(button); // <-- Add to Group
}
candidatesLayout.addView(rowTextView);
candidatesLayout.addView(radioGroup); // Add Group itself
}

Arrange buttons from bottom instead of top?

I am dynamically creating the buttons. But the problem is they are getting created from top. I want to create it from bottom .
public class MainActivity extends Activity implements View.OnClickListener {
int i, j, butNum, lay1num = 1, lay2num = 100, lay3num = 100, store;
Button[] Button;
EditText numBut;
LinearLayout mainLayout;
LinearLayout[] subLayout;
LinearLayout.LayoutParams params;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
butNum = 5;
Button = new Button[butNum];
subLayout = new LinearLayout[3];
LinearLayout mainLayout = new LinearLayout(this);
mainLayout.setOrientation(LinearLayout.HORIZONTAL);
mainLayout.setWeightSum(90);
mainLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
layoutGen();
for (j = 0; j < butNum; j++) {
int value = j + 1;
Button[j] = new Button(this);
Button[j].setText("" + value);
Button[j].setLayoutParams(new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
Button[j].setTextSize(20);
Button[j].setTag(value);
Button[j].setId(j);
subLayout[0].addView(Button[j]);
Button[j].setOnClickListener(this);
}
mainLayout.addView(subLayout[0], params);
setContentView(mainLayout);
}
Is there anyway I can create buttons which are aligned to the bottom.
subLayout.setGravity(Gravity.BOTTOM);
You nay need to set size of layout to match_parent.
Eventually You may set a layout_gravity like here

RadioGroup.check(int) not working

I'm having a little trouble with RadioGroups.
I created a blank radiogroup in layout.
And then filled it with equalizer presets in the code.
Then I tried to set one of the option using radiogroup.check(1).
But it threw a null pointer exception.
Below is the code:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.equalizer);
//rgEqualizer = (RadioGroup) findViewById(R.id.rgEqualizerPreset);
mPlayer = new MediaPlayer();
mEqualizer = new Equalizer(0, AuID);
rgEqualizer = new RadioGroup(this);
radioButtonList = new ArrayList<RadioButton>();
layoutParams = new RadioGroup.LayoutParams(
RadioGroup.LayoutParams.FILL_PARENT,
RadioGroup.LayoutParams.WRAP_CONTENT);
fillRadioGroupWithRadioButtons();
rgEqualizer.setEnabled(true);
rgEqualizer.setOnCheckedChangeListener(this);
addContentView(rgEqualizer, layoutParams);
loadPresetsettings();
}
private void fillRadioGroupWithRadioButtons() {
Short noPresets = mEqualizer.getNumberOfPresets();
short i = 0;
while (i < noPresets) {
RadioButton rb = new RadioButton(this);
rb.setText(mEqualizer.getPresetName(i));
rgEqualizer.addView(rb, layoutParams);
i++;
}
}
private void loadPresetsettings() {
rgEqualizer.check(1);
}
It seems like even after adding the child radio buttons fillRadioGroupWithRadioButtons(), there are no childs added in radiogroup.
What am I missing/
Thanks in advance
Done with a work around I guess
RadioButton o = (RadioButton) rgEqualizer.getChildAt(1);
o.setChecked(true);
You have defined rgEqualizer two times in your code.
rgEqualizer = (RadioGroup) findViewById(R.id.rgEqualizerPreset); <----- Here
mPlayer = new MediaPlayer();
mEqualizer = new Equalizer(0, AuID);
rgEqualizer = new RadioGroup(this); <---- And here //Delete this

How to set onClickListener for the textviews generated dynamically?

Can anyone please guide me on how to setOnClickListener for the TextViews that are generated dynamically.
I have few buttons in my app.Now when a particular button is clicked than some specific text elements are retrieved from the database based on the the number of elements returned corresponding TextViews are generated in order to display the retrieved text elements.
Now the problem that i'm having is that i don't know how to set onClickListner for the dynamically generated TextViews.Following is the piece of code where i'm creating my TextViews.Please guide me on what should i do.thank you
public void onClick(View v) {
switch (v.getId()) {
case R.id.imageButton1:
catagory = "General";
IndependentDB genData = IndependentDB.getInstance();
genData.open(this);
ArrayList<TextHolder> genList = new ArrayList<TextHolder>();
genList = genData.getAllTextFromGenT();
genData.close();
x = genList.size();
String xstr = new StringBuilder().append(x).toString();
System.out.println(xstr);
mainText = new TextView[x];
textLayout = new LinearLayout[x];
llseperator = new LinearLayout[x];
textLayoutContainer
.setBackgroundResource(R.color.dark_navy_blue);
if (!genList.isEmpty()) {
for (int i = 0; i < x; i++) {
TextHolder firstOne = genList.get(i);
String text = firstOne.getText();
mainText[i] = new TextView(this);
mainText[i].setId(i);
mainText[i].setText("Text");
mainText[i].setLayoutParams(new LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
mainText[i].setTextSize(25);
mainText[i].setGravity(Gravity.CENTER);
mainText[i].setText(text);
mainText[i].setTextColor(0xFFFFFFFF);
mainText[i].setClickable(true);
mainText[i].setOnClickListener(this);
llseperator[i] = new LinearLayout(this);
llseperator[i].setId(i);
llseperator[i].setLayoutParams(new LayoutParams(
LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
llseperator[i].setGravity(Gravity.CENTER);
llseperator[i]
.setBackgroundResource(R.drawable.tv_seperator);
textLayout[i] = new LinearLayout(this);
textLayout[i].setId(i);
textLayout[i].setLayoutParams(new LayoutParams(
LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
textLayout[i].setGravity(Gravity.CENTER);
textLayout[i].addView(mainText[i]);
textLayoutContainer.addView(textLayout[i]);
textLayoutContainer.addView(llseperator[i]);
}// End of for
}// End of If
break;}
You already have onClick() method in Activity class (implemented View.setOnClickListener) so I suggest you to create a new class which implements View.setOnClickListener interface to handle click of TextView.
Try,
class TextClick implements View.setOnClickListener {
#Override
public void onClick(View view) {
TextView tx=(TextView) view;
...
}
}
and set click listener,
TextClick click=new TextClick();
for (int i = 0; i < x; i++) {
TextHolder firstOne = genList.get(i);
String text = firstOne.getText();
mainText[i] = new TextView(this);
mainText[i].setOnClickListener(click);
...
}
It's the same setting on click listeners regardless of if the view was dynamically generated.
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
dosomething();
}
});
For example. you have a List tvs to store your TextView Objects created by the db result. What you should do is like this:
for(int i =0;i<tvs.count;i++){
tvs.get(i).setOnClickListener(new OnClickListener(){
...
})
}

Create a new TextView programmatically then display it below another TextView

String[] textArray={"one","two","asdasasdf asdf dsdaa"};
int length=textArray.length;
RelativeLayout layout = new RelativeLayout(this);
RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
for(int i=0;i<length;i++){
TextView tv=new TextView(getApplicationContext());
tv.setText(textArray[i]);
relativeParams.addRule(RelativeLayout.BELOW, tv.getId());
layout.addView(tv, relativeParams);
}
I need to do something like that.. so it would display as
one
two
asdfasdfsomething
on the screen..
If it's not important to use a RelativeLayout, you could use a LinearLayout, and do this:
LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
Doing this allows you to avoid the addRule method you've tried. You can simply use addView() to add new TextViews.
Complete code:
String[] textArray = {"One", "Two", "Three", "Four"};
LinearLayout linearLayout = new LinearLayout(this);
setContentView(linearLayout);
linearLayout.setOrientation(LinearLayout.VERTICAL);
for( int i = 0; i < textArray.length; i++ )
{
TextView textView = new TextView(this);
textView.setText(textArray[i]);
linearLayout.addView(textView);
}
Try this code:
final String[] str = {"one","two","three","asdfgf"};
final RelativeLayout rl = (RelativeLayout) findViewById(R.id.rl);
final TextView[] tv = new TextView[10];
for (int i=0; i<str.length; i++)
{
tv[i] = new TextView(this);
RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams
((int)LayoutParams.WRAP_CONTENT,(int)LayoutParams.WRAP_CONTENT);
params.leftMargin = 50;
params.topMargin = i*50;
tv[i].setText(str[i]);
tv[i].setTextSize((float) 20);
tv[i].setPadding(20, 50, 20, 50);
tv[i].setLayoutParams(params);
rl.addView(tv[i]);
}
public View recentView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Create a relative layout and add a button
relativeLayout = new RelativeLayout(this);
btn = new Button(this);
btn.setId((int)System.currentTimeMillis());
recentView = btn;
btn.setText("Click me");
relativeLayout.addView(btn);
setContentView(relativeLayout);
btn.setOnClickListener(new View.OnClickListener() {
#Overr ide
public void onClick(View view) {
//Create a textView, set a random ID and position it below the most recently added view
textView = new TextView(ActivityName.this);
textView.setId((int)System.currentTimeMillis());
layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.BELOW, recentView.getId());
textView.setText("Time: "+System.currentTimeMillis());
relativeLayout.addView(textView, layoutParams);
recentView = textView;
}
});
}
This can be modified to display each element of a String array in different TextViews.
You're not assigning any id to the text view, but you're using tv.getId() to pass it to the addRule method as a parameter. Try to set a unique id via tv.setId(int).
You could also use the LinearLayout with vertical orientation, that might be easier actually. I prefer LinearLayout over RelativeLayouts if not necessary otherwise.

Categories

Resources