在创建视图时,如何测量视图的宽度?

时间:2015-06-07 09:53:46

标签: java android

我尝试连接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 个答案:

答案 0 :(得分:1)

  

如何在创建视图时测量视图的宽度?

你不能。这是在测量和布局过程中处理的,这在创建窗口小部件后很好地发生。

  

我试图连接单个单词的TextView并创建它们的多个行。

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

如果FlowLayout无法满足您的需求,here is another one

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