为什么onClickListener在这个例子中不再工作?
我试图创建Android的一个GridView下面的例子here,只是按钮除了图像。这是我改变了代码:为什么onClickListener在这个例子中不再工作?
public class ButtonAdapter extends BaseAdapter {
private Context mContext;
private String[] filesnames = {
"File 1",
"File 2",
"Roflcopters",
"File 1",
"File 2",
"Roflcopters",
"File 1",
"File 2",
"Roflcopters",
"File 1",
"File 2",
"Roflcopters"
};
public ButtonAdapter(Context c) {
mContext = c;
}
public int getCount() {
return filesnames.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
Button btn;
if (convertView == null) {
// if it's not recycled, initialize some attributes
btn = new Button(mContext);
btn.setLayoutParams(new GridView.LayoutParams(100, 85));
btn.setPadding(8, 8, 8, 8);
}
else {
btn = (Button) convertView;
}
btn.setText(filesnames[position]);
// filenames is an array of strings
btn.setTextColor(Color.WHITE);
btn.setBackgroundResource(R.drawable.sample_0);
btn.setId(position);
return btn;
}
}
,当然,我略微改变了主要的Java代码,我已经叫这个适配器和活性不同:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.select_route);
GridView gridview = (GridView) findViewById(R.id.selectroute_view);
gridview.setAdapter(new ButtonAdapter(this));
gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
Toast.makeText(SelectRoute.this, "" + position,
Toast.LENGTH_SHORT).show();
}
});
}
一切正常,到目前为止, ,除了点击其中一个按钮时,我不会收到吐司消息。我没有看到任何错误 - 那么我做错了什么?
在机器人时嵌套需要默认(Button
或ImageButton
)聚焦或可点击Android系统一个两个视图将/可能偏向一个。对于你的情况还记得你有AdapterView
(这种情况下,其GridView
)的布局也可点击的,这意味着这些Button
太它不知道你是否想点击GridView中的行或Button
行里面(如果你这样做不知道android中的网格视图和列表视图的行是可点击的,即使没有按钮内)。
所以会发生什么是Android系统不知道你想点击行或Button
行里面是什么。不幸的是,可点击的行为已被给予Button
,而不是您看起来设置的那一行onItemClickListener
,这行不起作用。
所以要解决你有你的问题如下选择:
删除按钮,只需TextView
取代它。该行将是可点击的,因为TextView
不会像Button
那样默认关注焦点。
2.创建自定义列。一行应该在外面定义为一个独立的视图,通过xml
和Button
在里面,然后你将它作为你的GridView
的一行膨胀。而在这之后添加以下atrributes到视图的parent/root
android:descendantFocusability="blocksDescendants"
这将采取全焦点,因为Button
将是一个后代,将被*阻止Button
。如果您没有连续制作多个Views的自定义GridView
行,则可以使用任何教程this tutorial。
最后,但最简单的选择,如果你真正爱你的布局,你不想删除您的按钮设定onClickListener
尽管很难用这种方式来获取View
的(Button
的)位置。我们在适配器的getView()
方法中添加此项。 方法如下:
public View getView(int position, View convertView, ViewGroup parent) {
Button btn;
if (convertView == null) {
// if it's not recycled, initialize some attributes
btn = new Button(mContext);
btn.setLayoutParams(new GridView.LayoutParams(100, 85));
btn.setPadding(8, 8, 8, 8);
}
else {
btn = (Button) convertView;
}
btn.setText(filesnames[position]);
// filenames is an array of strings
btn.setTextColor(Color.WHITE);
btn.setBackgroundResource(R.drawable.sample_0);
btn.setId(position);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Button button=(Button)v;
Toast.makeText(mContext, "You clicked "+button.getText().toString()+" with ID "+button.getId(), Toast.LENGTH_SHORT).show();
}
return btn;
}
您是否尝试过直接把点击监听器适配器中按钮?
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
Button btn;
if (convertView == null) {
// if it's not recycled, initialize some attributes
btn = new Button(mContext);
btn.setLayoutParams(new GridView.LayoutParams(100, 85));
btn.setPadding(8, 8, 8, 8);
}
else {
btn = (Button) convertView;
}
btn.setText(filesnames[position]);
// filenames is an array of strings
btn.setTextColor(Color.WHITE);
btn.setBackgroundResource(R.drawable.sample_0);
btn.setId(position);
//ADD THIS, to get context just getContext from the view.
btn.setOnClickListener...
return btn;
}
我会尝试,但我不明白为什么它不会像原来的例子工作... – Alex
随着你的建议我有局部变量访问等问题 – Alex