2016-02-08 1 views
2

Потому что я хотел бы сделать то же самое, как Whatsapp, он помещает сообщение и час в той же строкеКак узнать, есть ли свободное место в TextView?

enter image description here

или в другой строке.

Иногда есть место, и Whatsapp помещает час в одну строку. Однако иногда нет места, и Whatsapp помещает час в другую строку.

Внутри или снаружи ...

Есть идеи?

+1

Я не пробовал это, поэтому не ставил его в ответ. Я бы ожидал, что время работы в выравнивании по правому краю будет работать. Если нет места, он выравнивается по правому краю на новой строке, иначе он выравнивается по правому краю в строке. http://stackoverflow.com/questions/6654022/multiple-alignment-in-textview – Kevin

ответ

1
public static final String TAG = "MainActivity"; 
private TextView mText; 
private RelativeLayout relativeLayout; 
private Boolean mFirstTime = true; 
private static final int WIDH_HOUR = 382; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    final int width = getScreensWidh(); 

    mText = (TextView) findViewById(R.id.activity_main_text); 
    relativeLayout = (RelativeLayout) findViewById(R.id.activity_main_relative); 

    mText.setText("aaaaa dfsafsa afdsfa fdsafas adfas fdasf adfsa dsa aaaa dfsafsa afdsfa fdsafas adfas fdasf adfsa"); 

    ViewTreeObserver vto = mText.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      if (mFirstTime) { 
       Layout layout = mText.getLayout(); 
       int lines = layout.getLineCount(); 

       int offset = layout.layout.getLineWidth(lines - 1); 
       int freeSpace = width - offset; 

       TextView hour = new TextView(MainActivity.this); 
       hour.setText("12:20"); 
       RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
       params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
       if (freeSpace > WIDH_HOUR) { 
        params.addRule(RelativeLayout.ALIGN_BOTTOM, R.id.activity_main_text); 
       } else { 
        params.addRule(RelativeLayout.BELOW, R.id.activity_main_text); 
       } 
       hour.setLayoutParams(params); 
       relativeLayout.addView(hour); 
       Log.d(TAG, String.valueOf(freeSpace)); 
       mFirstTime = false; 
      } 

     } 
    }); 


} 

public int getScreensWidh() { 
    Display display = getWindowManager().getDefaultDisplay(); 
    Point size = new Point(); 
    display.getSize(size); 
    return size.x; 

} 

Два Общедоступные методы

  • общественного аннотация INT getLineCount()

Возвращает количество строк текста в этой схеме.

  • общественного INT getLineWidth (интермедиат линия)

Получает беззнаковое горизонтальный размер указанной линии, в том числе ведущим отступа и конечные пробелы.

0

Думаю, вы можете дать textView.getLayout().getLineWidth(lineNum) a try (lineNum - это, очевидно, последняя строка). Затем сравните его с шириной макета родителя, и если разница больше timestamp.getWidth() плюс дополнительное дополнение, то вы отобразите его на той же строке.