18

我正在尝试设置布局,textview以便我可以使用getEllipsisCount()方法。但下面的代码返回 null 作为布局值。我怎样才能采取布局然后使用getEllipsisCount(0)方法。

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView mytextview =(TextView) findViewById(R.id.textView1);
        mytextview.setText(myText);
    
        Layout layout = mytextview.getLayout();
        if(layout != null){
            mytextview.setText("very good layout worked\n");
        }
    }
}
4

6 回答 6

37

你调用它太早了,这就是它返回的原因null

尝试这个

  ViewTreeObserver vto = mytextview.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
           Layout layout = mytextview.getLayout();  
        }
    });
于 2013-05-15T08:08:20.987 回答
5

文档中:

公共最终布局 getLayout()

在 API 级别 1 中添加 返回当前用于显示文本的布局。如果文本或宽度最近发生了变化,这可以为 null。

因此,您的文本可能发生了变化,或者您调用它太早了。

看看这个答案在哪里说明

这仅在布局阶段之后有效,否则返回的布局将为空,因此请在代码中的适当位置调用它。

于 2013-05-15T07:50:40.397 回答
4

称呼

TextView.onPreDraw();

它创建布局。

于 2017-04-28T07:40:57.620 回答
0

呼入或回拨mytextview.getLayout()onStartonResume

于 2013-05-15T07:39:49.310 回答
0

我最近自己也遇到了这个问题。对于该线程的任何新手,@Pragnani 接受的答案以及来自@dimsuz 的评论提供了一个不错且紧凑的解决方案。在文本视图的视图树中添加一个OnPreDrawListener,等待对布局的引用并使用它,最后在任何需要布局的工作完成后移除侦听器。

给定来自 OP 的示例代码,实现该解决方案可能如下所示:

public class MainActivity extends Activity implements ViewTreeObserver.OnPreDrawListener {

    // maintain a reference to the view so we can later remove the listener
    private TextView mytextview;

    @Override
    public boolean onPreDraw() {
        Layout layout = mytextview.getLayout();
        if (layout != null) {

            // use layout here...
            int n = layout.getEllipsisCount(0);

            // work requiring a layout is finished; remove listener from view
            mytextview.getViewTreeObserver().removeOnPreDrawListener(this);
        }
        return true;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mytextview = (TextView) findViewById(R.id.textView1);

        // add listener to the view
        mytextView.getViewTreeObserver().addOnPreDrawListener(this);
    }
}
于 2020-11-27T23:22:06.357 回答
-1

首先,我不知道这是拼写错误还是故意的,但您声明了一个“settext”方法而不是预定义的setText. 但是,要获得您的布局参考,我建议您执行以下操作:

LayoutInflater inflater = getLayoutInflater();

RelativeLayout textViewLayout = (RelativeLayout) inflater.inflate(R.layout.activity_main,null);

if (textViewLayout != null) {
    mytextview.setText("very good layout worked\n");
}

假设您的 TextView 属于RelativeLayout.

于 2013-05-15T07:43:33.010 回答