So klicken oder tippen Sie auf einen TextView-Text

199

Ich weiß, dass dies so einfach ist (doh ...), aber ich suche nach einer Möglichkeit, eine Methode zum Tippen oder Klicken auf eine TextView-Textzeile in einer Android-App auszuführen.

Ich denke immer an Button-Listener und anonyme Methoden-Listener-Aufrufe, aber es scheint einfach nicht auf TextView zuzutreffen.

Kann mich jemand auf ein Codefragment verweisen, um zu zeigen, wie das Klicken oder Tippen auf einen Text in einer Textansicht eine Methode ausführt?

Droide
quelle
64
Sie sollten wirklich die oberste Antwort akzeptieren.
Marek Sebera
8
Dafür musste er sich einloggen.
Carl Anderson
15
Und er hat auch einen schönen Benutzernamen
weggenommen
Für die Zukunft, wenn jemand Kotlin verwendet und die volle Kontrolle über den anklickbaren Text mit Rückruf haben möchte, habe ich einen Artikel darüber geschrieben, um eine Erweiterungsfunktion für TextView- link.medium.com/TLq6s8ltc3
Hossain Khan

Antworten:

456

Sie können den Klick-Handler in XML mit folgendem Attribut festlegen:

android:onClick="onClick"
android:clickable="true"

Vergessen Sie nicht das anklickbare Attribut, ohne das der Click-Handler nicht aufgerufen wird.

main.xml

    ...

    <TextView 
       android:id="@+id/click"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"               
       android:text="Click Me"
       android:textSize="55sp"
       android:onClick="onClick"                
       android:clickable="true"/>
    ...

MyActivity.java

       public class MyActivity extends Activity {

          public void onClick(View v) {
            ...
          }  
       }
Patrick Cullen
quelle
60
"Vergessen Sie das anklickbare Attribut nicht. Ohne dieses Attribut wird der Klick-Handler nicht aufgerufen." Diese Zeile hat den Tag gerettet. Vielen Dank Kumpel.
N-JOY
2
developer.android.com/reference/android/view/… muss etwas über klickbar erwähnen. hätte eine Stunde sparen können.
Taylor
4
Lustigerweise setzt using setOnClickListenerdas clickableAttribut, aber das onClickAttribut anscheinend nicht.
NJZK2
5
Es scheint , wie onClick nicht gesetzt das clickableAttribut in Android 5.0 Lollipop (API 21). Vielleicht hielten sie es für einen Fehler, dass dies in älteren Versionen nicht passiert ist?
Mark Doliner
Gibt es eine Möglichkeit, dies für lange Klicks über XML zu tun?
Amyth
52

Das ist vielleicht nicht ganz das, wonach Sie suchen, aber das hat für das funktioniert, was ich tue. All dies ist nach meinem onCreate:

boilingpointK = (TextView) findViewById(R.id.boilingpointK);

boilingpointK.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if ("Boiling Point K".equals(boilingpointK.getText().toString()))
            boilingpointK.setText("2792");
        else if ("2792".equals(boilingpointK.getText().toString()))
            boilingpointK.setText("Boiling Point K");
    }
});
Joshua Sutherland
quelle
28

OK, ich habe meine eigene Frage beantwortet (aber ist es der beste Weg?)

So führen Sie eine Methode aus, wenn Sie in einer Textansicht auf Text klicken oder darauf tippen:

package com.textviewy;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

public class TextyView extends Activity implements OnClickListener {

TextView t ;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    t = (TextView)findViewById(R.id.TextView01);
    t.setOnClickListener(this);
}

public void onClick(View arg0) {
    t.setText("My text on click");  
    }
}

und meine main.xml ist:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 >
<LinearLayout android:id="@+id/LinearLayout01" android:layout_width="wrap_content"             android:layout_height="wrap_content"></LinearLayout>
<ListView android:id="@+id/ListView01" android:layout_width="wrap_content"   android:layout_height="wrap_content"></ListView>
<LinearLayout android:id="@+id/LinearLayout02" android:layout_width="wrap_content"   android:layout_height="wrap_content"></LinearLayout>

<TextView android:text="This is my first text"
 android:id="@+id/TextView01" 
 android:layout_width="wrap_content" 
 android:textStyle="bold"
 android:textSize="28dip"
 android:editable = "true"
 android:clickable="true"
 android:layout_height="wrap_content">
 </TextView>
 </LinearLayout>
Droide
quelle
13

In einer Aktivität, die ein Layout und eine Textansicht aufruft, funktioniert dieser Klick-Listener wie folgt:

setContentView(R.layout.your_layout);
TextView tvGmail = (TextView) findViewById(R.id.tvGmail);
String TAG = "yourLogCatTag";
tvGmail.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View viewIn) {
                try {
                    Log.d(TAG,"GMAIL account selected");
                } catch (Exception except) {
                    Log.e(TAG,"Ooops GMAIL account selection problem "+except.getMessage());
                }
            }
        });

Die Textansicht wird wie folgt deklariert (Standardassistent):

        <TextView
            android:id="@+id/tvGmail"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/menu_id_google"
            android:textSize="30sp" />

und in der Datei strings.xml

<string name="menu_id_google">Google ID (Gmail)</string>
Tony Gil
quelle
11

Obwohl Sie das Problem beheben können, indem Sie den Listener auf Textansicht einstellen, wird empfohlen, dies nicht zu tun. Sie sollten die flache Schaltfläche verwenden, da es sich um eine Unterklasse von Schaltflächen handelt und viele Attribute enthält, die TextView nicht bietet.


Um die flache Schaltfläche zu verwenden, fügen Sie das style="?android:attr/borderlessButtonStyle"Attribut hinzu -

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="DONE"
    style="?android:attr/borderlessButtonStyle"/>
Verwechseln
quelle
7

in textView

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="New Text"
    android:onClick="onClick"
    android:clickable="true"

Sie müssen auch View.OnClickListener implementieren und in der On Click-Methode die Absicht verwenden

    Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
           intent.setData(Uri.parse("https://youraddress.com"));    
            startActivity(intent);

Ich habe getestet, dass diese Lösung gut funktioniert.

rp23b
quelle
3

Um auf einen Teil des Textes (nicht auf den gesamten Text TextView) zu klicken , können Sie Htmloder verwenden Linkify(beide erstellen Links, die URLs öffnen, jedoch keinen Rückruf in der App).

Linkify

Verwenden Sie eine Zeichenfolgenressource wie:

<string name="links">Here is a link: http://www.stackoverflow.com</string>

Dann in einer Textansicht:

TextView textView = ...
textView.setText(R.string.links);
Linkify.addLinks(textView, Linkify.ALL);

Html

Verwenden von Html.fromHtml:

<string name="html">Here you can put html &lt;a href="http://www.stackoverflow.com"&gt;Link!&lt;/&gt;</string>

Dann in Ihrer Textansicht:

textView.setText(Html.fromHtml(getString(R.string.html)));
njzk2
quelle
0

Sie können TextWatcher für TextView verwenden, es ist flexibler als ClickLinstener (nicht am besten oder schlechter, nur mehr in eine Richtung).

holder.bt_foo_ex.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // code during!

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            // code before!

        }

        @Override
        public void afterTextChanged(Editable s) {
            // code after!

        }
    });
Marcelo Amaral
quelle