类似的覆盖2个不同的听众

时间:2014-08-05 13:36:11

标签: java android override

我是Java的初学者,与C语言相比,我不熟悉它的语法。

具体来说,我有以下代码;有2个TextViews view1, view2,点击Toast

时会弹出相同的TextViews消息
public class MainActivity extends ActionBarActivity {

private TextView view1, view2;

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

        view1 = (TextView)findViewById(R.id.item_1a);
        view1.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v) {
                Toast.makeText(v.getContext(),"button clicked",Toast.LENGTH_SHORT).show();
            }
        });

        view2 = (TextView)findViewById(R.id.item_1b);
        view2.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                Toast.makeText(v.getContext(),"button clicked",Toast.LENGTH_SHORT).show();
            }   
        });
}   
}

我意识到,如果有100 TextViews,如果我继续覆盖onClick 100次,效率会很低。

因此,有没有办法只覆盖onClick一次,让setOnClickListener的所有实例都引用回onClick

谢谢!

5 个答案:

答案 0 :(得分:1)

定义一个按

行实现OnClickListener的类
class MyClickListener implements OnClickListener{

        @Override
        public void onClick(View v) {
            Toast.makeText(v.getContext(),"button clicked",Toast.LENGTH_SHORT).show();
        }
}

然后你可以到处使用同一个类。例如:

// say you have 100 TextViews
for (int i = 0; i < views.length; i++)
    views[i].setOnClickListener(new MyClickListener());

答案 1 :(得分:1)

如果是相同的消息,你可以这样做:

public class MainActivity extends ActionBarActivity {

    private TextView view1, view2;

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

        OnClickListener listener = new OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(v.getContext(), "button clicked", Toast.LENGTH_SHORT).show();
            }
        };
        view1 = (TextView) findViewById(R.id.item_1a);
        view1.setOnClickListener(listener);

        view2 = (TextView) findViewById(R.id.item_1b);
        view2.setOnClickListener(listener);
    }
}

答案 2 :(得分:1)

不确定。您正在实施的内容称为&#34;匿名内部类型&#34;。

OnClickListener listener = new OnClickListener()
            {
                @Override
                public void onClick(View v) {
                    Toast.makeText(v.getContext(),"button clicked",Toast.LENGTH_SHORT).show();
                }
            };

view1 = (TextView)findViewById(R.id.item_1a);
view1.setOnClickListener(listener);
view2 = (TextView)findViewById(R.id.item_2a);
view2.setOnClickListener(listener);

或者您可以创建OnClickListener类的子类,例如@webuster answers。

答案 3 :(得分:1)

您可能会影响变量的监听器并将其分配给视图:

OnClickListener listener = new OnClickListener(){
    @Override
    public void onClick(View v) {
        Toast.makeText(v.getContext(),"button clicked",Toast.LENGTH_SHORT).show();
    }   
};

view1.setOnClickListener(listener);

view2.setOnClickListener(listener);

答案 4 :(得分:1)

您必须在每个View上设置onclicklistener,但有一种更简洁的方法。

将其放入活动代码:

    public void myOnclickListener(View v) {
            Toast.makeText(v.getContext(),"button clicked",Toast.LENGTH_SHORT).show();
    }

然后在xml中设置click侦听器:

   <TextView
        android:id="@+id/mytext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:onClick="myOnclickListener"
       />