我有一个 super TestUI 应用程序。它有一个带有按钮的 GridView 。
我希望将按钮点击的字词传递回主 Activity,以便它可以更新其状态。
可悲的是按钮窃取了点击。所以典型的:
gridview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Toast.makeText(TestUI.this, "" + position, Toast.LENGTH_SHORT).show();
}
});
不被调用。
取而代之的是在适配器定义中:
public View getView(int position, View convertView, ViewGroup parent) {
Button gridItem;
if (convertView == null) { // if it's not recycled, initialize some attributes
gridItem = new Button(mContext);
} else {
gridItem = (Button) convertView;
}
gridItem.setText("button " + String.valueOf(position));
gridItem.setClickable(true);
gridItem.setFocusable(false);
gridItem.setOnClickListener(new MyOnClickListener(position, mContext));
return gridItem;
它由实现 OnClickListener 接口(interface)的 MyOnClickListener 类支持。但是,如果我这样做,我仍然需要回调到主要 Activity ,它需要以某种方式知道某些事情已经完成,因为它控制着程序状态。
那么通过单击按钮更新“根”类/Activity 状态的最佳方法是什么?
我知道这是一个基本的 OO 问题,但我主要用 ASM 和 C 编写,所以坦率地说,我只是不知道。
最佳答案
为什么需要有 2 个 onClickListeners。从 onItemClickListener
到主要 Activity ,您不能完成所有需要做的工作吗?适配器是否需要执行 MyOnClickListener
工作?
您可以在主 Activity 中设置 gridItem.setOnClickListener。无需每次都创建一个新的 ListenerObject。
你只需要一个 xml 来膨胀到包含 Button 的 getView
<Button android:text="Handle me"
android:id="@+id/btnHandleMe"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="buttonHandler"
android:clickable="true">
并为您的 Activity 创建此功能。
public void buttonHandler(View v) {
// Do your stuff here that new MyOnClickListener(position, mContext) whould do.
}
您可以通过向适配器添加标签来获取此按钮在列表/网格中填充的行/列的位置。
在getView中添加
gridItem.setTag(position)
并从 buttonHandler 中获取它
if(v.getTag instance of Integer)
int position = (Integer)v.getTag();
现在您可以处理来自 Activity 的所有点击,并且默认情况下 Activity 会收到通知。
关于android - 将按钮 onClick 传递回主要 Activity 的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7313923/