私はこれがとても簡単であることを知っています(doh ...)が、私はAndroidアプリでTextViewのテキスト行をタップまたはクリックしてメソッドを実行する方法を探しています。
私はボタンリスナーと匿名メソッドリスナー呼び出しについて考え続けていますが、それはTextViewには当てはまりません。
TextViewでテキストの一部をクリックまたはタップするとメソッドがどのように実行されるかを示すコードスニペットを誰かに教えてもらえますか。
これらの属性を使用して、クリックハンドラをxmlに設定できます。
Android:onClick="onClick"
Android:clickable="true"
Clickable属性を忘れないでください。それがなければ、クリックハンドラは呼び出されません。
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) {
...
}
}
これはあなたが探しているものではないかもしれませんが、これは私がやっていることのために働いたものです。これらすべてが私の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私は自分の質問に答えました(しかしそれが最善の方法ですか?)
これは、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");
}
}
そして私のmain.xmlは:
<?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>
このクリックリスナーは、レイアウトとテキストビューを呼び出すアクティビティ内から動作します。
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());
}
}
});
テキストビューは次のように宣言されています(デフォルトウィザード)。
<TextView
Android:id="@+id/tvGmail"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="@string/menu_id_google"
Android:textSize="30sp" />
strings.xmlファイルで
<string name="menu_id_google">Google ID (Gmail)</string>
リスナーをtextviewに設定することで問題を解決できますが、しないことをお勧めします。 Buttonのサブクラスであり、TextViewにはない多くの属性を提供するので、 flat button を使用する必要があります。
フラットボタンを使用するには、style="?android:attr/borderlessButtonStyle"
属性を追加します -
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="DONE"
style="?android:attr/borderlessButtonStyle"/>
textView内
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="New Text"
Android:onClick="onClick"
Android:clickable="true"
View.OnClickListenerも実装する必要があり、On Clickメソッドではインテントを使用できます。
Intent intent = new Intent(Android.content.Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://youraddress.com"));
startActivity(intent);
私はこの解決策を試してみました。
(TextView
全体ではなく)テキストの一部をクリックするには、Html
またはLinkify
を使用できます(どちらもURLを開くリンクを作成できますが、アプリのコールバックではありません)。
Linkify
次のような文字列リソースを使用してください。
<string name="links">Here is a link: http://www.stackoverflow.com</string>
テキストビューで:
TextView textView = ...
textView.setText(R.string.links);
Linkify.addLinks(textView, Linkify.ALL);
Html
Html.fromHtml
を使う:
<string name="html">Here you can put html <a href="http://www.stackoverflow.com">Link!</></string>
それからあなたのテキストビューで:
textView.setText(Html.fromHtml(getString(R.string.html)));
あなたはTextViewのためにTextWatcherを使うことができます、ClickLinstenerよりももっと柔軟です(最善でも最悪でもなく、より多くの1つの方法で)。
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!
}
});