如何检查textView是否为椭圆形Android

时间:2016-06-22 17:13:00

标签: android nullpointerexception textview

我想知道如何检查我的textView是否被椭圆化..

这是我的代码片段:

if(txtDescription.equals("")) {
    txtDescription.setVisibility(View.GONE);
} else if(txtDescription.getLayout().getEllipsisCount(1)  > 0){ // this line is giving  java.lang.NullPointerException
    txtDescription.setVisibility(View.VISIBLE);
} else {
    txtDescription.setVisibility(View.VISIBLE);
}

但我总是得到一个java.lang.NullPointerException,我认为它来自getLayout()方法..

这是TextView的XML:

<TextView 
           android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearance"
            android:id="@+id/txtDescription"
            android:ellipsize="end"
            android:singleLine="true"
            android:visibility="gone"
            android:layout_marginTop="5dp" />

2 个答案:

答案 0 :(得分:2)

txtDescription.getLayout()将返回null,因为您的textview布局尚未完成。 因此,您应该检查textView是否在onGlobalLayout方法中进行椭圆化处理,如此

ViewTreeObserver vto = textview.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
              Layout l = txtDescription.getLayout();
              if ( l != null){  
                 // check your textview is being ellipsized or not here
                 ...
              }          
       }
});

答案 1 :(得分:0)

昨天我遇到与 NullPointerException 相同的问题,而在TextView文档中尝试getLayout()和Alhamdulillah发现这里是名为 onLayout()的受保护方法,这个在TextView布局和渲染完成时调用。之后我在我的情况下扩展AppCompatTextView (或者如果你不使用appcompat库你可以使用TextView)并覆盖它的 onLayout()方法,接下来将上下文强制转换为Activity类,并从该类调用一些公共方法。

class TextViewForLayout extends AppCompatTextView {
Context mContext;

void SetContext(Context context)
{
    mContext = context;
}

public TextViewForLayout(Context context) {
    super(context);
    SetContext(context);
}

public TextViewForLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
    SetContext(context);
}

public TextViewForLayout(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    SetContext(context);
}

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    super.onLayout(changed, left, top, right, bottom);
    if (!changed) {
        ((MyActivity) mContext).someMethod();
    }
}
}

在你的Activity类中,你需要有Ui线程处理程序和runnable作为全局变量,就像在我的情况下一样(或者通过传递参数使用另一种方式使用runnables)

public class MyActivity extends AppCompatActivity {
    Handler mainHandler;
    Runnable addViewTo;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mylayout);

        mainHandler = new Handler();

        addViewTo = new Runnable() {
        @Override
        public void run() {
                // add single view or iterate throug List, Array or some Collections
                someParent.addView(childView);
           }
        };
    }

    public void someMethod()
    {
        // do something with textView.getLayout().....
       // and post the addViewTo runnable to mainHadler
      // or the manipulations with UI will not shown
    }
}