2012-11-21 6 views
8

Ich mache Chat-App. Ich möchte neben der Chat-Blase auch einen Zeitstempel setzen. Die Nachrichten werden links (für empfangen) und rechts (für gesendet) ausgerichtet.Programmatically relateLayout toRightOf zu toLeftOf

Also, ich bin auf der Suche nach einer Möglichkeit, toLeftOf zu toRightOf zu ändern. Vorerst sieht es so aus:

Timestamp wrongly aligned

Hier ist meine XML-Code für jede Nachricht (ich habe ArrayAdapter, die damit umgehen)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/wrapper" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" > 

     <TextView 
      android:id="@+id/bubble" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textColor="#ffffff" /> 

     <TextView 
      android:id="@+id/timeStamp" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerVertical="true" 
      android:layout_toRightOf="@+id/bubble" /> 

</RelativeLayout> 

ich googeln um und diese gefunden, aber nicht Arbeit:

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
    RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
if(isReceivedMessage){ 
    params.addRule(RelativeLayout.RIGHT_OF, R.id.bubble); 
} 
else{ 
    params.addRule(RelativeLayout.LEFT_OF, R.id.bubble); 
} 
timeStampTextView.setLayoutParams(params); 

Irgendwelche Lösung? Dank

Antwort

2

Rewrite
Entfernen Sie das Attribut layout_toRightOf aus dem aktuellen Textview, dann zwei verschiedene LayoutParams erzeugen: eine für toRightOf und eine für toLeftOf. Sie können die Parameter abhängig von Ihren Bedürfnissen ändern.

Eine Alternative besteht darin, einen benutzerdefinierten Adapter mit zwei Layouts zu verwenden. Dieser Ansatz sollte schneller sein, da Sie das Layout nicht zur Laufzeit neu anordnen, sondern zwei getrennte Listen der Layouts "Antworten" und "Senden" im Ansichtsrecycler führen.

(Als Hinweis, API 17 removeRule() eingeführt, aber dies wird nicht nur noch helfen.)

+0

Ich kann nicht scheinen, die 'removeRule()' Methode zu finden. Ist das eingebaut oder müssen wir zuerst machen? – hrsetyono

+1

Sorry, es war nur [in API 17 hinzugefügt] (http://developer.android.com/reference/android/widget/RelativeLayout.LayoutParams.html#removeRule%28int%29) ... Was nicht hilft aktuelle Geräte. Aber ich glaube immer noch, dass der Ansatz mit mehreren Layouts am besten ist. – Sam

+0

Warte, hast du versucht, zwei verschiedene LayoutParams zu verwenden? Und wechseln sie mit 'tv.setLayoutParams (leftParams)'? – Sam

0

Bitte verwendet Code unten.

RelativeLayout wrapper = (RelativeLayout) findViewById(R.id.wrapper); 
if(isReceivedMessage){ 
    wrapper.setGravity(Gravity.RIGHT); 
} 
else{ 
    wrapper.setGravity(Gravity.LEFT); 
} 
+0

Dieser Code soll die Sprechblase richtig ausrichten? Ich habe das schon getan – hrsetyono

+0

ja, ich habe diesen Code testen. – Nikhil

+0

Eigentlich suche ich nach einer Möglichkeit, die Timestamp-Position zu ändern. Ich habe bereits den Code, der die Blase ausrichten – hrsetyono

10

diese versuchen, die toRightOf und toLeftOf Eigenschaft von irgendwelchen view.I am Entfernen dieser Eigenschaften von Textview zu entfernen.

TextView header2=(TextView) findViewById(R.id.text_view_header_shoppinglist); 
     RelativeLayout.LayoutParams mLayoutParams2=(RelativeLayout.LayoutParams)header2.getLayoutParams(); 
     mLayoutParams2.addRule(RelativeLayout.LEFT_OF,0); 
     mLayoutParams2.addRule(RelativeLayout.RIGHT_OF,0); 
+1

Danke. Ich habe das mit der obigen Antwort gelöst, aber nächstes Mal werde ich das versuchen – hrsetyono