2015-06-07 38 views
2

我试图连接单个单词的TextViews并创建它们的多排行。为了确定何时创建一个新行,我需要检查单词“TextViews”的宽度。我如何在创建视图时测量视图的宽度?

这里是一个事先知情同意,类似于什么即时试图完成

preview picture

我得到一个奇怪的错误,当我尝试使用getWidth

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.widget.RelativeLayout.getWidth()' on a null object reference 

然而,当我调试代码rL2不是null并且有一个值。

我猜我的视图尚未创建?但是我怎样才能动态地改变它呢?我如何制作我的排?

这里是我的代码:

@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

如何衡量自己的看法宽度为我创造呢?

你不能。这是在度量和布局过程中处理的,在创建小部件后会发生这种情况。

我想连接单个单词的TextViews并创建它们的多行。

它看起来像你应该使用a FlowLayout,或类似的东西,作为TextViews的容器,它会自动包装它们。

如果该FlowLayout不符合您的需求,here is another one

而且,如果这些都不是你想要的,你可以用它们来写作自己的灵感。您试图实现的UI规则应该在容器中实现,因为容器处理大小和定位其子级。

+0

感谢第二个链接的工作,但第一个给出了一个错误“java.lang.ClassCastException:android.view.ViewGroup $ LayoutParams不能转换为android.view.ViewGroup $ MarginLayoutParams”与完全相同的代码,所以ID建议秒链接 –