2014-09-06 40 views
2

这是我第一次张贴在这个论坛上,希望它会没事的:)2 TextViews,留下了省略号,右接NOWRAP,单线

我深化发展的Android应用程序在我的城市公共交通。

Here is what I have

[ |short destination ||next departure| ] 
[ |way too long dest...||next departure| ] 

Here is what I want:

[ |short destination||next departure| ] 
[ |way too long dest...||next departure| ] 

下面是一个更完整的例子:s28.postimg.org/5gejnvfd9/actual2.png

奇怪颜色的背景只是在这里轻松地识别布局/文字浏览。你也可以忽略棕色线(这是可以的)。

基本上,我想拥有长度可变的目的地[红色背景],在其右侧,我想要第一次出发时间[绿色背景]。一切都在一条线上。

我需要始终将首次出发信息完全显示(nowrap)。目的地可以用省略号(...)包裹。 [可选问题,如何用'。'替换省略号'...' ?]

这里是最好的工作代码,我到目前为止有:

<RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"> 

     <TextView 
      android:id="@+id/txtTitleDestination" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_toLeftOf="@+id/txtTitleFirstDeparture" 
      android:background="#FF0000" 
      android:ellipsize="end" 
      android:maxLines="1" 
      android:padding="0dp" 
      android:scrollHorizontally="true" 
      android:textSize="18sp" 
      android:textStyle="bold" /> 

     <TextView 
      android:id="@+id/txtTitleFirstDeparture" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="0dp" 
      android:layout_marginRight="0dp" 
      android:layout_alignParentRight="true" 
      android:background="#00FF00" 
      android:ellipsize="none" 
      android:maxLines="1" 
      android:padding="0dp" 
      android:textSize="18sp" 
      android:textStyle="bold" 
      /> 

    </RelativeLayout> 

我试过TableLayout和LinearLayour代替RelativeLayout的,但没有成功:(

任何想法如何我能做到这一点?

提前感谢!

Louloox

[解决] 只要有轻轻修改valbertos答案:

titleDestination.post(new Runnable() { 
     @Override 
     public void run() {    
      int widthTextViewDeparture = measureTextWidthTextView(titleFirstTime, pContext); 
      int widthTextViewDestination = titleDestination.getWidth(); 
      int widthTextViewParent = rl_parent.getWidth(); 
      if(widthTextViewDestination + widthTextViewDeparture > widthTextViewParent) { 
       titleDestination.setWidth(widthTextViewParent - widthTextViewDeparture); 
       titleDestination.setEllipsize(TruncateAt.END); 
       titleDestination.setHorizontallyScrolling(true); 
      } 
     } 
    }); 

设置的省略号仅在必要时使正常截断文本。

Before: 
Lingolsheim Thiergaten --> Lingolsheim...  [1'23"] 21h23 

With the modification: 
Lingolsheim Thiergaten --> Lingolsheim Thi... [1'23"] 21h23 

再次感谢:)

+0

下面是一个更完整的例子:http://s28.postimg.org/5gejnvfd9/actual2.png – louloox 2014-09-06 17:58:10

+0

你必须understant那是什么,内容是动态地从一个WebService检索。因此,我不知道目的地名称有多大,所以我肯定需要“目标名称”TextView动态(根据宽度),我不希望这个“隐藏”右边TextView中。 – louloox 2014-09-06 18:00:24

回答

1

要做你要求的,你必须根据第二个视图的文本宽度动态调整第一个视图的宽度。

//代码

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

    final TextView tv_1 = (TextView) findViewById(R.id.tv_1); 
    tv_1.post(new Runnable() { 
     @Override 
     public void run() { 
      View rl_parent = findViewById(R.id.rl_parent); 
      TextView tv_2 = (TextView) findViewById(R.id.tv_2); 
      int widthTextView2 = measureTextWidthTextView(tv_2); 
      if(tv_1.getWidth() + widthTextView2 > rl_parent.getWidth()) { 
       tv_1.setWidth(tv_1.getWidth() - widthTextView2); 
      } 
     } 
    }); 
} 

private int measureTextWidthTextView(TextView textView) { 
    int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(getScreenWidth(), View.MeasureSpec.AT_MOST); 
    int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 
    textView.measure(widthMeasureSpec, heightMeasureSpec); 
    return textView.getMeasuredWidth(); 
} 

private int getScreenWidth() { 
    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
    Display display = wm.getDefaultDisplay(); 
    Point size = new Point(); 
    display.getSize(size); 
    return size.x; 
} 

//布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="300dp" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <RelativeLayout 
     android:id="@+id/rl_parent" 
     android:layout_width="match_parent" 
     android:layout_height="40dp" 
     android:background="#348D63"> 

     <TextView 
      android:id="@+id/tv_1" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:background="#BD160B" 
      android:gravity="center_vertical" 
      android:maxLines="1" 
      android:paddingLeft="10dp" 
      android:paddingRight="10dp" 
      android:text="Elsau Elsau Elsau Elsau Elsau Elsau Elsau" 
      android:textStyle="bold" /> 

     <TextView 
      android:id="@+id/tv_2" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_toRightOf="@+id/tv_1" 
      android:gravity="center_vertical" 
      android:minWidth="50dp" 
      android:paddingLeft="10dp" 
      android:paddingRight="10dp" 
      android:text="[11:30 14:23]" 
      android:textStyle="bold" /> 

    </RelativeLayout> 

    <!-- Rest of the layout --> 

</LinearLayout> 

使用Android:MAXLINES = “1”,而不是机器人:单线= “true” 以摆脱掉丑点-as我在我的例子中做了。

此外,我建议您使用include作为“时间”部分,而不是重复两次TextViews。我只是这样做,以保持简单的例子。

+0

嗨valbertos, 谢谢,但我试过两个RelativeLayout都是你提出的,但是如果左边的TextView太长,第一个不会让右边的TextView可见。 第二个RelativeLayout对左边的TextView有一个固定的宽度,因为它有一个动态的大小,所以这是不正确的。 – louloox 2014-09-06 17:52:51

+0

我没理解你。再试一次,我修改了我的问题;) – 2014-09-06 19:09:08

+0

好吧,其实看起来你明白我的意思了:)我想根据正确的大小调整左侧TextView的宽度,以便右侧总是完全显示1行。但我认为我可以从xml视图执行此操作。我会很快尝试你的解决方案:)谢谢。 – louloox 2014-09-06 20:18:46

0

也许你应该使用的LinearLayout代替的RelativeLayout和使用layout_weight属性。

<LinearLayout android:orientation="horizontal" ...> 
    <TextView android:id="@+id/txtTitleDestination" android:layout_width="wrap_content" ... /> 
    <TextView android:id="@+id/txtTitleFirstDeparture" android:layout_width="0dp" android:layout_weight="1" ... /> 
</LinearLayout> 
+0

嗨pomber, 嗯,谢谢,这也是我的第一个想法,但它不工作:如果左边的TextView太长,右边的不可见... – louloox 2014-09-06 17:56:03

2

我发现了一种使用线性布局的方法,诀窍是不要忘记width =“wrap_content”为linearLayout,希望它可以提供帮助。

<LinearLayout 
android:layout_width="wrap_content" 
android:layout_height="match_parent" 
android:orientation="horizontal"> 


<TextView 
    android:layout_width="0dip" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:ellipsize="end" 
    android:singleLine="true" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:singleLine="true" /> 

+0

Wonderfull它的工作!无需编码。谢谢 – jmaffre 2016-02-12 10:37:01