Je sais que c'est si facile (doh ...) mais je cherche un moyen d'exécuter une méthode en tapotant ou en cliquant sur une ligne de texte TextView dans une application Android.
Je continue de penser aux écouteurs de bouton et aux appels d'écoute de méthode anonymes, mais cela ne semble tout simplement pas s'appliquer à TextView.
Quelqu'un peut-il m'indiquer un extrait de code pour montrer comment cliquer ou taper sur un morceau de texte dans un TextView exécute une méthode?
Vous pouvez définir le gestionnaire de clics en xml avec ces attributs:
Android:onClick="onClick"
Android:clickable="true"
N'oubliez pas l'attribut cliquable, sans cela, le gestionnaire de clics n'est pas appelé.
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) {
...
}
}
Ce n'est peut-être pas tout à fait ce que vous cherchez, mais c'est ce qui a fonctionné pour ce que je fais. Tout cela après ma 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");
}
});
OK j'ai répondu à ma propre question (mais est-ce le meilleur moyen?)
Voici comment exécuter une méthode lorsque vous cliquez ou appuyez sur du texte dans un TextView:
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");
}
}
et mon main.xml est:
<?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>
à l'intérieur d'une activité qui appelle une mise en page et une vue en texte, cet écouteur de clics fonctionne:
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());
}
}
});
la vue texte est déclarée comme ceci (assistant par défaut):
<TextView
Android:id="@+id/tvGmail"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="@string/menu_id_google"
Android:textSize="30sp" />
et dans le fichier strings.xml
<string name="menu_id_google">Google ID (Gmail)</string>
Bien que vous puissiez résoudre le problème en définissant le programme d'écoute sur textview, il est recommandé de ne pas le faire. Vous devez utiliser flat button car il s’agit d’une sous-classe de Button qui fournit de nombreux attributs que TextView ne possède pas.
Pour utiliser le bouton plat, ajoutez l'attribut style="?android:attr/borderlessButtonStyle"
-
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="DONE"
style="?android:attr/borderlessButtonStyle"/>
dans textView
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="New Text"
Android:onClick="onClick"
Android:clickable="true"
Vous devez également implémenter View.OnClickListener et la méthode On Click peut utiliser l'intention
Intent intent = new Intent(Android.content.Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://youraddress.com"));
startActivity(intent);
J'ai testé cette solution fonctionne bien.
Pour cliquer sur une partie du texte (pas sur la totalité de TextView
), vous pouvez utiliser Html
ou Linkify
(les deux créent des liens qui ouvrent des URL, mais pas un rappel dans l'application).
Linkify
Utilisez une ressource de chaîne telle que:
<string name="links">Here is a link: http://www.stackoverflow.com</string>
Puis dans un textview:
TextView textView = ...
textView.setText(R.string.links);
Linkify.addLinks(textView, Linkify.ALL);
Html
Utiliser Html.fromHtml
:
<string name="html">Here you can put html <a href="http://www.stackoverflow.com">Link!</></string>
Puis dans votre textview:
textView.setText(Html.fromHtml(getString(R.string.html)));
Vous pouvez utiliser TextWatcher pour TextView, est plus souple que ClickLinstener (pas mieux ou pire, seulement plus dans un sens).
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!
}
});