2013-12-13 32 views
0

我需要水平显示两个单行TextView。左边的TextView(我们将其命名为1)可能会有更长的文本,可能会缩短并以“...”结束。正确的文本视图(2)有一个简短的文本,不应该缩短。android让左边的textview缩短并保持完全可见

我想让1保持与父对象的左端对齐。对齐的1

右侧的2现在有2个条件,我必须满足

a)如果1有一个简短的文字,那么2个应该得到排列为1(无权的缩短)。

b)但是如果1的文本太长,那么1的文本应该缩短'...',而视图2最大地移动到父级的右边,但仍然保持完全可见(no。 ..)

我目前的解决方案如下。场景b)对我来说没问题,但在a)的情况下,问题是视图2被移动到父视图的右侧,而1到左侧 - 都很短,它们之间有很大的空间看起来奇怪。我想要2移动到更远的左侧(1旁边),并将此空间留在右侧。

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="0dp" 
    android:layout_marginTop="1dp" 
    android:layout_weight="0.5"> 

    <TextView 
     android:id="@+id/ns_in_txt" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_alignParentRight="true" 
     android:gravity="top|left" 
     android:maxLines="1" 
     android:singleLine="true" 
     android:textColor="#00a2ff" 
     android:textSize="18sp" /> 

    <TextView 
     android:id="@+id/ns_txt" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_alignParentLeft="true" 
     android:layout_toLeftOf="@id/ns_in_txt" 
     android:gravity="top|left" 
     android:maxLines="1" 
     android:singleLine="true" 
     android:textColor="#00a2ff" 
     android:textSize="18sp" /> 
</RelativeLayout> 
+0

也许我找到了你的问题的解决方案,看我的编辑回答。问候。 – Fllo

回答

0

尝试做这个

<RelativeLayout 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_context" 
    android:layout_marginTop="1dp"> 

    <TextView 
      android:id="@+id/ns_in_txt" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:layout_alignParentRight="true" 
      android:gravity="left" 
      android:maxLines="1" 
      android:ellipsize="end" 
      android:singleLine="true" 
      android:textColor="#00a2ff" 
      android:textSize="18sp" /> 

    <TextView 
      android:id="@+id/ns_txt" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_alignParentLeft="true" 
      android:layout_toLeftOf="@id/ns_in_txt" 
      android:gravity="left" 
      android:maxLines="1" 
      android:singleLine="true" 
      android:textColor="#00a2ff" 
      android:textSize="18sp" /> 

</RelativeLayout> 
+0

没有对不起,它不工作:( –

+0

我认为这一行 android:layout_alignParentRight =“true” 使事情出错...... ns_in_txt的条件应该是先获得最大限度的左边,然后不超过父母......并且我不能一次执行两个...... –

0

显然,你想两种情况需要设置不同的方向父布局:第一水平,第二个垂直。也许我错了(我希望如此,但)在静态xml,这将是很难做到这一点。

尝试下面的代码来测试,如果我错了:

方案1:方向水平=文本1不够大

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginTop="1dp" 
    android:orientation="horizontal" > 

    <TextView 
     android:id="@+id/textLong" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="left" 
     android:ellipsize="end" 
     android:singleLine="true" 
     android:textColor="#00a2ff" 
     android:textSize="18sp" 
     android:text="This is a normal text not big" /> 

    <TextView 
     android:id="@+id/textShort" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="right" 
     android:singleLine="true" 
     android:textColor="#00a2ff" 
     android:textSize="18sp" 
     android:text="short text" /> 

</LinearLayout> 

方案2: orientation vertical =文字1太大

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginTop="1dp" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/textLong" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="left" 
     android:ellipsize="end" 
     android:singleLine="true" 
     android:textColor="#00a2ff" 
     android:textSize="18sp" 
     android:text="This is a biiiggg loooonnng teeeeexxxxxtttt" /> 

    <TextView 
     android:id="@+id/textShort" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="right" 
     android:singleLine="true" 
     android:textColor="#00a2ff" 
     android:textSize="18sp" 
     android:text="short text" /> 

</LinearLayout> 

要解决您的问题,您可以尝试2个解决方案。

首先,尝试创建一个maxLenght限制,该限制在您的Activity中计算并更改LinearLayout的父级方向。获取您拥有的字符数量并显示方向。
二,定制你自己的课程延伸TextView。然后创建一个getWidth方法,该方法返回长度为TextView的宽度与其父级相比较并更改方向。

也许下面的问题/答案可能是有用的(我觉得有没有解决方案,但更多的灵感):
In Android how to get the width of the Textview which is set to Wrap_Content
Get the size of a text in TextView
How to find android TextView number of characters per line?
Auto Scale TextView Text to Fit within Bounds


编辑:

我fou找到上面我写的最后一个网址的解决方案。看到这个答案,开发者希望与你一样。所以他决定创建一个可自动识别的文本视图。看看这里:Move two side by side textviews to be one under another if text is too long

我希望这会帮助你。

+0

这是一个很好的主意,直到最后我还没有测试过,因为我从kimikanen中查找了一个,并且它在没有太多改变的情况下直接运行。 ,非常感谢你花费的时间和精力:) –

+0

没问题,如果有效,我为你感到高兴! ;) – Fllo

0

我可以建议使用LinearLayout和一点点编码的组合。这个想法是让他们并排放置,不管大小。在正确的文本视图进行测量和布局之后,将左侧文本视图的最大宽度设置为剩余空间。

这里是这里的布局文件,没有什么特别的:

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

    <TextView 
     android:id="@+id/ns_in_txt" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:ellipsize="end" 
     android:gravity="top|left" 
     android:maxLines="1" 
     android:singleLine="true" 
     android:textColor="#00a2ff" 
     android:textSize="18sp" /> 

    <TextView 
     android:id="@+id/ns_txt" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:ellipsize="none" 
     android:gravity="top|left" 
     android:maxLines="1" 
     android:singleLine="true" 
     android:textColor="#00a2ff" 
     android:textSize="18sp" /> 

</LinearLayout> 

,并添加一些代码到活动/片段:

final TextView tvLeft = (TextView) findViewById(R.id.ns_txt); 
final TextView tvRight = (TextView) findViewById(R.id.ns_in_txt); 
ViewTreeObserver obs = tvRight.getViewTreeObserver(); 
obs.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
      @Override 
    public void onGlobalLayout() { 
     tvLeft.setMaxWidth(SCREEN_WIDTH - tvRight.getWidth()); 
    } 
}); 
+0

你是天才,除此之外别无他法:) –

相关问题