2

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

preview picture

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; } 

1 Answer 1

1

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.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks the second link worked, however the first one gave an error "java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.view.ViewGroup$MarginLayoutParams" with exact same code so id recommend second link

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.