1

为了更好的 UI,我想用 TextViews 代替 Buttons。单击 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

您的活动(基于您的代码没有任何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 回答
0

确保您的 Activity 中有以下方法(具有匹配的签名)。他们每个人都应该接受一个参数,即 a View

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