2012-05-19 6 views
21

Ich brauche etwas Text mit einem Zeichen auf der linken Seite und ich möchte etwas Code ausführen, wenn der Benutzer klickt/berührt das Bild (nur das Bild, nicht der Text), also ich Verwendet ein LinearLayout mit einem TextView und ein ImageView, die anklickbar ist und ein OnClick-Ereignis startet. Der XML-Parser schlägt vor, ich ersetze dies durch eine TextView mit einer zusammensetzbaren, die die gleiche Sache mit weit weniger Zeilen von XML .. Ich meine Frage kann kann ich angeben, ich möchte ein onClick-Ereignis behandeln nur auf der Zeichenfläche TextView und nicht auf der TextView selbst? Ich habe einige Lösungen gesehen, die Ihre eigene Erweiterung von TextView schreiben, aber ich bin nur daran interessiert, es im Layout zu tun Ressource, wenn möglich, sonst behalte ich die folgenden XML Code:Implement onClick nur für eine TextView Compound Zeichnungsfähige

<LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:orientation="horizontal" > 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:gravity="bottom" 
      android:paddingTop="10dp" 
      android:paddingLeft="10dp" 
      android:paddingRight="10dp" 
      android:text="@string/home_feedback_title" 
      android:textColor="@android:color/primary_text_dark" 
      android:textStyle="bold" 
      android:paddingBottom="4dp"/> 


     <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:src="@drawable/action_feedback" 
      android:clickable="true" 
      android:onClick="onClickFeedback" 
      android:contentDescription="@string/action_feedback_description"/> 
</LinearLayout> 

Antwort

6

Sie können in beide Richtungen gehen. Die Verwendung der Compound-Drawable ist jedoch schneller, da sie eine Optimierung darstellen sollte. Es verwendet weniger RAM, weil du 3 Ansichten in 1 reduzierst und es ist schneller, weil du 1 Tiefe verlierst.

Wenn ich Sie wäre, würde ich in Betracht ziehen zurückzutreten, um zu sehen, ob sowohl der Text als auch das Bild die Berührung abfangen, um irgendeine Aktion zu tun, ist möglicherweise eine gute Sache. Im Allgemeinen macht es einen größeren Berührungsbereich einfacher zu drücken. Manche Benutzer neigen dazu, den Text anstelle des Bildes zu berühren.

Zuletzt, wenn Sie diese Route der Zusammenführung der 2 gehen, könnten Sie eine Button anstelle einer TextView verwenden möchten. Sie können die Schaltfläche so formatieren, dass sie das Rechteck nicht umgibt. Sie nennen es einen randlosen Knopf. Es ist schön, weil Sie ein visuelles Feedback erhalten, dass Sie auf ein umsetzbares Element geklickt haben, wo normalerweise ImageView oder TextView nicht umsetzbar sind.

How to Create Borderless Buttons in Android

30

Es ist sehr einfach. Nehmen wir an, Sie haben ein Zeichen auf der linken Seite Ihres TextView 'txtview'. Folgendes wird den Trick machen.

TextView txtview = (TextView) findViewById(R.id.txtview); 
txtview.setOnTouchListener(new OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if(event.getAction() == MotionEvent.ACTION_UP) { 
      if(event.getRawX() <= txtview.getTotalPaddingLeft()) { 
       // your action for drawable click event 

      return true; 
      } 
     } 
     return true; 
    } 
}); 

Wenn Sie Recht ziehbar ändern wollen die if-Anweisung:

if(event.getRawX() >= txtview.getRight() - txtview.getTotalPaddingRight()) 

In ähnlicher Weise können Sie es für alle Verbindung Drawables tun.

Dieser Methodenaufruf gibt das gesamte Padding auf dieser Seite zurück, einschließlich aller Zeichen. Sie können dies auch für TextView, Button usw. verwenden.

Klicken Sie auf here als Referenz von Android-Entwickler-Website.

+0

Es scheint, es ist sicherer, nur das ursprüngliche Layout zu verwenden ... – deathangel908

2

@ Vishnuvathsans Antwort ist fast perfekt, aber getRaw() gibt eine absolute x-Position des Berührungspunktes zurück. Wenn sich die Textansicht nicht am linken Rand der Ansicht befindet, sollten Sie sie mit der absoluten Position der Textansicht vergleichen, indem Sie getLocationOnScreen verwenden. Der folgende Code ist ein Beispiel, um sowohl den linken, als auch den rechten, ziehbaren Tap zu prüfen.

textView.setOnTouchListener(new OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if(event.getAction() == MotionEvent.ACTION_UP) { 
      int[] textLocation = new int[2]; 
      textView.getLocationOnScreen(textLocation); 

      if(event.getRawX() <= textLocation[0] + textView.getTotalPaddingLeft()) { 

       //Left drawable was tapped. 

       return true; 
      }` 


      if(event.getRawX() >= textLocation[0] + textView.getWidth() - textView.getTotalPaddingRight()){ 

       //Right drawable was tapped. 

       return true; 
      } 
     } 
     return true; 
    } 
});