在 View.OnClickListener 实现中调用 finish() class
Call finish() within a View.OnClickListener implementation class
有一个 Activity 显示列表项(通过 cursorAdapter)。
listItem 的 XML 包含一些按钮。在 Cursor Adapter 的 newView()
方法中,这些按钮获得 onClickListener
,而不是通过匿名声明,有一个 class 实现了监听器。如果单击某个按钮,所有发生的 activity 应该结束。
我对在按钮 class 中调用 finish()
不起作用并不感到惊讶。 activityContext.finish
也不行。
那我该如何管理呢?
public class DetailActvityActionBtn implements View.OnClickListener {
private Context context;
@Override
public void onClick(View view){
context = view.getContext();
System.out.println("CONTEXT:" + context);
///Itemroot
LinearLayout root =(LinearLayout) view.getRootView().findViewById(R.id.detailRoot);
///Tag that stores data
ItemViewAndDataHolder holder = (ItemViewAndDataHolder) root.getTag();
System.out.println("HOLDER: " + holder.toString());
//Get id of item
int id = holder.getId();
//Get quantity of item
int quantity = Integer.parseInt(holder.getQuantity().getText().toString().replaceAll("[^0-9]",""));
///Append id to URI
Uri updateItemUri = ContentUris.withAppendedId(InventoryDB_Contract.entries.CONTENT_URI, id);
///To determine the clicked button, get ID as String
String btnIDasString = context.getResources().getResourceName(view.getId());
System.out.println(btnIDasString);
ContentValues values = new ContentValues();
int updatedRow;
switch (btnIDasString){
case "com.example.android.inventoryapp:id/plusBtn":
System.out.println("plus");
values.put(InventoryDB_Contract.entries.COLUMN_PRODUCT_QUANTITY_IN_STOCK, quantity + 1);
context.getContentResolver().update(updateItemUri, values, null, null);
//CRcaller.saleItem(1);
break;
case "com.example.android.inventoryapp:id/minusBtn":
System.out.println("mins");
values.put(InventoryDB_Contract.entries.COLUMN_PRODUCT_QUANTITY_IN_STOCK, quantity - 1);
updatedRow = context.getContentResolver().update(updateItemUri, values, null, null);
break;
case "com.example.android.inventoryapp:id/deleteItemBtn":
System.out.println("delete");
context.getContentResolver().delete(updateItemUri, null, null);
context.finish();
break;
}
}
}
public class DetailActvityActionBtn implements View.OnClickListener
您没有扩展 Activity
或 Fragment
或任何类似的东西,您没有执行 context.finish();
的上下文,因为 finish()
是 Activity
.
如果此 class 从 Activity
中使用,则将 activity 的引用传递给 class 构造函数,如下所示:
public MainActivity extends Activity{
//You standard onCreate() blah...
DetailActvityActionBtn yourHandlerClass = new DetailActvityActionBtn(this);
}
public class DetailActvityActionBtn implements View.OnClickListener {
private Activity activity;
public DetailActvityActionBtn(Activity activity){
this.activity = activity;
}
@Override
public void onClick(View view){
//You can now call activity.finish() to close the calling activity...
activity.finish();
}
就我个人而言,我建议解除按钮对 activity 的依赖。与其在 Button class 中设置 onClick 的功能,不如在您的控制器 (Activity) 中定义该功能?您可以定义一个 onClick 方法并使用您的列表视图逻辑来确定哪些按钮应该具有此功能。
如果您只是简单地控制业务逻辑那将是一回事,但我个人认为让视图定义控制器生命周期是令人费解的。控制器可以允许按钮关闭自身,但任何其他方式和按钮开始与它可能不应该的东西对话。也许您遵循的范式与 MVC 不同,所以我可能是错的!
我在想一些事情:
@Override
public View getView(int position, View v, ViewGroup parent) {
if(condition1){
v.button.setOnClickListener(locallyDefinedOnClickForCondition1);
}
else if(condition2){
v.button.setOnClickListener(locallyDefinedOnClickForCondition2);
}
}
绝对不会说这是最好的解决方案,但也许这可以让您朝着正确的方向前进。大家有什么意见吗?
将您的 activity 上下文强制转换为 activity。然后调用finish方法
Activity act=(Activity)context;
act.finish();
有一个 Activity 显示列表项(通过 cursorAdapter)。
listItem 的 XML 包含一些按钮。在 Cursor Adapter 的 newView()
方法中,这些按钮获得 onClickListener
,而不是通过匿名声明,有一个 class 实现了监听器。如果单击某个按钮,所有发生的 activity 应该结束。
我对在按钮 class 中调用 finish()
不起作用并不感到惊讶。 activityContext.finish
也不行。
那我该如何管理呢?
public class DetailActvityActionBtn implements View.OnClickListener {
private Context context;
@Override
public void onClick(View view){
context = view.getContext();
System.out.println("CONTEXT:" + context);
///Itemroot
LinearLayout root =(LinearLayout) view.getRootView().findViewById(R.id.detailRoot);
///Tag that stores data
ItemViewAndDataHolder holder = (ItemViewAndDataHolder) root.getTag();
System.out.println("HOLDER: " + holder.toString());
//Get id of item
int id = holder.getId();
//Get quantity of item
int quantity = Integer.parseInt(holder.getQuantity().getText().toString().replaceAll("[^0-9]",""));
///Append id to URI
Uri updateItemUri = ContentUris.withAppendedId(InventoryDB_Contract.entries.CONTENT_URI, id);
///To determine the clicked button, get ID as String
String btnIDasString = context.getResources().getResourceName(view.getId());
System.out.println(btnIDasString);
ContentValues values = new ContentValues();
int updatedRow;
switch (btnIDasString){
case "com.example.android.inventoryapp:id/plusBtn":
System.out.println("plus");
values.put(InventoryDB_Contract.entries.COLUMN_PRODUCT_QUANTITY_IN_STOCK, quantity + 1);
context.getContentResolver().update(updateItemUri, values, null, null);
//CRcaller.saleItem(1);
break;
case "com.example.android.inventoryapp:id/minusBtn":
System.out.println("mins");
values.put(InventoryDB_Contract.entries.COLUMN_PRODUCT_QUANTITY_IN_STOCK, quantity - 1);
updatedRow = context.getContentResolver().update(updateItemUri, values, null, null);
break;
case "com.example.android.inventoryapp:id/deleteItemBtn":
System.out.println("delete");
context.getContentResolver().delete(updateItemUri, null, null);
context.finish();
break;
}
}
}
public class DetailActvityActionBtn implements View.OnClickListener
您没有扩展 Activity
或 Fragment
或任何类似的东西,您没有执行 context.finish();
的上下文,因为 finish()
是 Activity
.
如果此 class 从 Activity
中使用,则将 activity 的引用传递给 class 构造函数,如下所示:
public MainActivity extends Activity{
//You standard onCreate() blah...
DetailActvityActionBtn yourHandlerClass = new DetailActvityActionBtn(this);
}
public class DetailActvityActionBtn implements View.OnClickListener {
private Activity activity;
public DetailActvityActionBtn(Activity activity){
this.activity = activity;
}
@Override
public void onClick(View view){
//You can now call activity.finish() to close the calling activity...
activity.finish();
}
就我个人而言,我建议解除按钮对 activity 的依赖。与其在 Button class 中设置 onClick 的功能,不如在您的控制器 (Activity) 中定义该功能?您可以定义一个 onClick 方法并使用您的列表视图逻辑来确定哪些按钮应该具有此功能。
如果您只是简单地控制业务逻辑那将是一回事,但我个人认为让视图定义控制器生命周期是令人费解的。控制器可以允许按钮关闭自身,但任何其他方式和按钮开始与它可能不应该的东西对话。也许您遵循的范式与 MVC 不同,所以我可能是错的!
我在想一些事情:
@Override
public View getView(int position, View v, ViewGroup parent) {
if(condition1){
v.button.setOnClickListener(locallyDefinedOnClickForCondition1);
}
else if(condition2){
v.button.setOnClickListener(locallyDefinedOnClickForCondition2);
}
}
绝对不会说这是最好的解决方案,但也许这可以让您朝着正确的方向前进。大家有什么意见吗?
将您的 activity 上下文强制转换为 activity。然后调用finish方法
Activity act=(Activity)context;
act.finish();