web-dev-qa-db-ja.com

TextViewテキストをクリックまたはタップする方法

私はこれがとても簡単であることを知っています(doh ...)が、私はAndroidアプリでTextViewのテキスト行をタップまたはクリックしてメソッドを実行する方法を探しています。

私はボタンリスナーと匿名メソッドリスナー呼び出しについて考え続けていますが、それはTextViewには当てはまりません。

TextViewでテキストの一部をクリックまたはタップするとメソッドがどのように実行されるかを示すコードスニペットを誰かに教えてもらえますか。

188
Droid

これらの属性を使用して、クリックハンドラを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) {
            ...
          }  
       }
448
Patrick Cullen

これはあなたが探しているものではないかもしれませんが、これは私がやっていることのために働いたものです。これらすべてが私の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");
    }
});
42

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>
28
Droid

このクリックリスナーは、レイアウトとテキストビューを呼び出すアクティビティ内から動作します。

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>
13
tony gil

リスナーを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"/>
7
Confuse

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);

私はこの解決策を試してみました。

6
rp23b

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 &lt;a href="http://www.stackoverflow.com"&gt;Link!&lt;/&gt;</string>

それからあなたのテキストビューで:

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

あなたは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!

        }
    });
0
Marcelo Amaral