Reputation: 2807
I'm trying to connect TextViews
of single words and create multilpe rows of them. In order to determine when to create a new line I need to check the width of the words' TextViews.
Here is a pic that is similar to what im trying to accomplish
I get a weird errors when I try to use getWidth
:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.widget.RelativeLayout.getWidth()' on a null object reference
However when I debug the code rL2 is not null and has a value.
Im guessing my View hasn't been created yet? But how can I alter it dynamically? How can I make my rows?
Here is my code:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_call_response, container, false);
v.measure(widthMeasureSpec, heightMeasureSpec);
int lineWidth = 0;
RelativeLayout rL2 = (RelativeLayout) v.findViewById(R.id.row1);
int lineCount = 0;
int rowWidth = rL2.getWidth();
int wordCountRow = 0;
TextView question = (TextView) v.findViewById(R.id.Question);
TextView choice1 = (TextView) v.findViewById(R.id.choice1);
TextView choice2 = (TextView) v.findViewById(R.id.choice2);
TextView choice3 = (TextView) v.findViewById(R.id.choice3);
TextView choice4 = (TextView) v.findViewById(R.id.choice4);
TextView speaker = (TextView) v.findViewById(R.id.Speaker);
TextView progress = (TextView) v.findViewById(R.id.progress);
ArrayList<String> answers = new ArrayList<>();
answers.addAll(quote.getAnswerChoice());
answers.add(quote.getWordSplitTypeA().get(quote.getAnswerIndex().get(0)));
Collections.shuffle(answers);
speaker.setText("How would " + quote.getSpeaker().get(0) + " Marx answer the above question?");
choice1.setText(answers.get(0));
choice2.setText(answers.get(1));
choice3.setText(answers.get(2));
choice4.setText(answers.get(3));
progress.setText(String.format("%.1f%% Complete", (SingletonFactory.getPlayer().getLessonProgress()[0] / 12.0) * 100));
//addTextViews(v);
for(int i = 0;i<quote.getWordSplitTypeA().size(); i++) {
if (lineWidth + 10 > rowWidth) {
lineCount++;
wordCountRow = 0;
}
int padding = getResources().getDimensionPixelOffset(R.dimen.wordBoxPadding);
TextView tv = new TextView(getActivity());
tv.setId(i);
tv.setText(quote.getWordSplitTypeA().get(i));
tv.setBackgroundColor(Color.parseColor(bGColor));
tv.setTextColor(Color.WHITE);
tv.setGravity(Gravity.CENTER);
tv.setPadding(padding, padding, padding, padding);
ViewGroup.LayoutParams LP = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
tv.setLayoutParams(LP);
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) tv.getLayoutParams();
if (wordCountRow == 0) {
params.addRule(RelativeLayout.CENTER_VERTICAL);
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
params.addRule(RelativeLayout.ALIGN_PARENT_START);
} else {
params.addRule(RelativeLayout.CENTER_VERTICAL);
params.addRule(RelativeLayout.RIGHT_OF, (i - 1));
}
tv.setLayoutParams(params);
if (quote.getAnswerIndex().contains(i)) {
tv.setBackgroundColor(Color.RED);
tv.setText(".....");
}
int width = tv.getWidth();
lineWidth += width;
if (lineCount == 0) {
RelativeLayout rL = (RelativeLayout) v.findViewById(R.id.row1);
rL.addView(tv);
} else if (lineCount == 1) {
RelativeLayout rL = (RelativeLayout) v.findViewById(R.id.row2);
rL.addView(tv);
} else if (lineCount == 2) {
RelativeLayout rL = (RelativeLayout) v.findViewById(R.id.row3);
rL.addView(tv);
} else if (lineCount == 3) {
RelativeLayout rL = (RelativeLayout) v.findViewById(R.id.row4);
rL.addView(tv);
}
choice1.setOnClickListener(mClickListener);
choice2.setOnClickListener(mClickListener);
choice3.setOnClickListener(mClickListener);
choice4.setOnClickListener(mClickListener);
question.setText(quote.getSpeaker().get(0) + ": " + quote.getQuote().get(0));
}
return v;
}
Upvotes: 2
Views: 57
Reputation: 1006554
How can I measure the width of my views as I create them?
You can't. That is handled during measure and layout passes, which happen well after you create the widget.
I'm trying to connect TextViews of single words and create multilpe rows of them.
It looks like you should be using a FlowLayout
, or something like that, as the container for the TextViews
, where it will wrap them automatically.
If that FlowLayout
does not meet your needs, here is another one.
And, if neither of those as quite what you want, you can use them for inspiration in writing your own. The UI rules that you are trying to implement should be implemented in the container, as the container handles sizing and positioning its children.
Upvotes: 1