Android 在View.OnClickListener实现类中调用finish()

Android 在View.OnClickListener实现类中调用finish(),android,android-activity,android-context,Android,Android Activity,Android Context,有一个活动(通过游标适配器)显示listItems listItem的XML包含一些按钮。在游标适配器的newView()方法中,这些按钮获取onClickListener,而不是通过匿名声明,有一个类实现了侦听器。如果点击某个按钮,所有发生的活动都应该结束 在button类中调用finish()活动上下文.finish也不起作用 那我该怎么办呢 public class DetailActvityActionBtn implements View.OnClickListener { priv

有一个活动(通过游标适配器)显示listItems

listItem的XML包含一些按钮。在游标适配器的
newView()
方法中,这些按钮获取
onClickListener
,而不是通过匿名声明,有一个类实现了侦听器。如果点击某个按钮,所有发生的活动都应该结束

在button类中调用
finish()<代码>活动上下文.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;

    }



}

}

公共类DetailActvityActionBtn实现View.OnClickListener

您没有扩展
活动
片段
或任何类似的内容,您没有要执行的上下文
context.finish()
from,因为
finish()
活动中的一种方法

如果该类是从
活动中使用的,则将该活动的引用传递给类构造函数,如下所示:

public MainActivity extends Activity{
  //You standard onCreate() blah...
   DetailActvityActionBtn yourHandlerClass = new DetailActvityActionBtn(this);

}


public类DetailActvityActionBtn实现View.OnClickListener

您没有扩展
活动
片段
或任何类似的内容,您没有要执行的上下文
context.finish()
from,因为
finish()
活动中的一种方法

如果该类是从
活动中使用的,则将该活动的引用传递给类构造函数,如下所示:

public MainActivity extends Activity{
  //You standard onCreate() blah...
   DetailActvityActionBtn yourHandlerClass = new DetailActvityActionBtn(this);

}


就个人而言,我建议将按钮的依赖性与活动的存在分离。与其在Button类中设置onClick的功能,为什么不在控制器(活动)中定义该功能?您可以定义一个onClick方法并使用listview逻辑来确定哪些按钮应该具有此功能

如果您只是控制业务逻辑,那将是一回事,但我个人认为,让视图定义控制器生命周期是一件复杂的事情。控制器可以允许按钮自行关闭,但任何其他方式都会使按钮开始谈论它可能不应该谈论的事情。也许你遵循的是与MVC不同的范式,所以我可能错了

我的想法大致如下:

@Override
  public View getView(int position, View v, ViewGroup parent) {
        if(condition1){
           v.button.setOnClickListener(locallyDefinedOnClickForCondition1);
        }
        else if(condition2){
           v.button.setOnClickListener(locallyDefinedOnClickForCondition2);
        }
     }

我肯定不会说这是最好的解决方案,但也许这会让你走上正确的方向。有人有什么批评吗?

就我个人而言,我建议将按钮的依赖性与活动的存在脱钩。与其在Button类中设置onClick的功能,为什么不在控制器(活动)中定义该功能?您可以定义一个onClick方法并使用listview逻辑来确定哪些按钮应该具有此功能

如果您只是控制业务逻辑,那将是一回事,但我个人认为,让视图定义控制器生命周期是一件复杂的事情。控制器可以允许按钮自行关闭,但任何其他方式都会使按钮开始谈论它可能不应该谈论的事情。也许你遵循的是与MVC不同的范式,所以我可能错了

我的想法大致如下:

@Override
  public View getView(int position, View v, ViewGroup parent) {
        if(condition1){
           v.button.setOnClickListener(locallyDefinedOnClickForCondition1);
        }
        else if(condition2){
           v.button.setOnClickListener(locallyDefinedOnClickForCondition2);
        }
     }

我肯定不会说这是最好的解决方案,但也许这会让你走上正确的方向。有人有任何批评吗?

将您的活动上下文输入到活动中。然后调用finish方法

Activity act=(Activity)context;
act.finish();

在活动中键入活动上下文。然后调用finish方法

Activity act=(Activity)context;
act.finish();
尝试getActivity().finish();请参见:尝试getActivity().finish();见此: