1

より良いUIのために、ボタンの代わりにTextViewsを使用することを考えました。TextViewをクリックすると、アプリケーションの次のページが表示されます。XMLファイルでonClick関数を定義しましたが、機能しません。

これがXMLファイルです。

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="16dp"
    android:onClick="serve"
    android:text="@string/Service"
    android:textSize="20dp" />

<TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/textView1"
    android:layout_below="@+id/textView1"
    android:layout_marginTop="87dp"
    android:onClick="complain"
    android:text="@string/Comp"
    android:textSize="20dp" />

<TextView
    android:id="@+id/textView3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/textView2"
    android:layout_below="@+id/textView2"
    android:layout_marginTop="121dp"
    android:onClick="feed"
    android:text="@string/Feedback"
    android:textSize="20dp" />

Javaファイル:

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    public void serve(View v)
    {
        Intent i=new Intent();
        i.setClass(this,Second.class);
        startActivity(i);
    }

    public void complain(View v)
    {
        Intent in=new Intent();
        in.setClass(this,Third.class);
        startActivity(in);
    }

    public void feed(View v)
    {
        Intent inn=new Intent();
        inn.setClass(this,Fourth.class);
        startActivity(inn);
    }
}
4

3 に答える 3

9

TextViewはデフォルトではクリックできないため、onClickアクションを呼び出すことはできません...android:clickable="true"各TextViewに次を追加するだけです。

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="16dp"
    android:clickable="true"
    android:onClick="serve"
    android:text="@string/Service"
    android:textSize="20dp" />

ボタンや他の多くのビューはユーザーの操作を期待しているため、既にクリック可能ですが、TextViewは必要ありません。


また、onClick()メソッドは同じ基本アクションを実行するため、代わりにジェネリックメソッドを検討してください。

public void click(View v) {
    Intent intent;
    switch(v.getId()) {
    case R.id.serve: // R.id.textView1
        intent = new Intent(this, Second.class);
        break;
    case R.id.complain: // R.id.textView2
        intent = new Intent(this, Third.class);
        break;
    case R.id.feed: // R.id.textView3
        intent = new Intent();
    }
    startActivity(intent);
}

次のように、各TextViewの属性idと属性を変更する必要があります。onClick

<TextView
    android:id="@+id/serve"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="16dp"
    android:clickable="true"
    android:onClick="click"
    android:text="@string/Service"
    android:textSize="20dp" />
于 2012-08-23T16:45:52.573 に答える
0

アクティビティに次のメソッド(署名が一致する)があることを確認してください。それらはそれぞれ、であるパラメータを取る必要がありますView

public void serve(View v) { }
public void complain(View v) { }
public void feed(View v) { }
于 2012-08-23T16:27:31.587 に答える
0

アクティビティ(コードに基づくものには何もありません)onClickListeners()textViewsへの参照を取得してから、イベントハンドラーを追加し、イベントハンドラー内で、serve(), complain(), feed()このSOの質問を参照してください。変更の例を次に示します。あなたの活動クラス。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    TextView textView1 = (TextView) findViewById(R.id.TextView1);
    textView1.setOnClickListener(new View.OnClickListener() {

        @Override
        protected void onClick(View view) {

            serve(view);
        }

    });

    //Repeat for each text view...
}

各TextViewには、xmlで設定された属性に対して次のものが必要です。

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

編集:

そのようにする場合、ActivityがOnclickListenerを実装する場所がまだわかりません...

public class MainActivity extends Activity implements OnclickListener {


    protected void onClick(View view) {
        // borrowed from @Sam
        Intent intent;

        switch(v.getId()) {
            case R.id.serve: // R.id.textView1
                intent = new Intent(this, Second.class);
                break;
            case R.id.complain: // R.id.textView2
                intent = new Intent(this, Third.class);
                break;
            case R.id.feed: // R.id.textView3
                intent = new Intent();
            }

            startActivity(intent);
    }

}
于 2012-08-23T16:49:48.947 に答える