2015-04-21 5 views
0

textview.getLayout() возвращает null в ListViewAdapter.getView()андроид TextView getlayout вернуть Null

Я предполагаю, что я звоню textview.getLayout() слишком рано, до появления сообщения textview.

Когда мне позвонить textview.getLayout()?

Если я использую ниже код, называемый getView() с ontinuously

ViewTreeObserver vto = textview.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     Layout layout = textview.getLayout(); 
     textview.setText("something") 
    } 
}); 

и textview.post(Runnable) возвращает null слишком

Layout layout = textview.getLayout(); 
String splitedText = text.substring(0, layout.getLineEnd(maxLines -1)).trim(); 
splitedText = splitedText + " ..." + moreStr; 

Использование layout.getLineEnd производит исключения нулевого указателя.

На этом этапе текстовое представление не равно null, но getLayout() возвращает null. Текстовое представление представляется инициализированным.

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    final Context context = parent.getContext(); 
    ViewHolder holder = new ViewHolder(); 

    if(convertView == null) 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    ..... 

    holder.timeLineContents = (TextView) convertView.findViewById(R.id.item_time_line_contents); 
+0

Просьба показать, как вы инициализировали «текстовое представление». – Keshav1234

+1

Вы уверены, что текст правильно инициализирован? Вы делаете это в деятельности или фрагменте? В своей деятельности я бы сделал это в методе onCreate. В фрагменте сделайте это в методе onCreateView. – Aster

+0

инициализированное текстовое изображение, подобное этому держателю.timeLineReply = (TextView) convertView.findViewById (R.id.time_line_reply_tv); – jcmhong

ответ

1

Согласно документации разработчиков Android,

public final Layout getLayout() 

Returns 
the Layout that is currently being used to display the text. 
This can be null if the text or width has recently changes. 

Так есть шанс getLayout() стать null в случае ширина текста изменяется?

+0

thx. полезно – jcmhong

0
holder.timeLineContents.setOnLayoutListener(new OnLayoutListener() { 

       @Override 
       public void onLayoutChanged(SpanTextView view) { 
        SpannableString mLinkableText = null; 
        InternalMoreSpan span = new InternalMoreSpan(mContext);  
        if(view.getLineCount() >= 2) { 
         Layout layout = view.getLayout(); 
         String splitedText = view.getText().toString().substring(0, layout.getLineEnd(2 - 1) - 6).trim(); 
         splitedText = splitedText + moreStr; 
         mLinkableText = new SpannableString(splitedText); 
         mLinkableText.setSpan(span, mLinkableText.length()- moreStr.length(), mLinkableText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
         view.setText(mLinkableText); 
        } 
       } 
      }); 

хорошо работает.

0

вызов TextView.onPreDraw() перед тем getLayout();

это делает mLayout в TextView;

+0

Пожалуйста, добавьте объяснения в свой ответ. –

Смежные вопросы