2017-07-11 1 views
0

Il existe une activité qui affiche listItems (via un cursorAdapter).Appelez finish() dans une classe d'implémentation View.OnClickListener

Le code XML de listItem contient des boutons. Dans la méthode newView() de l'adaptateur de curseur, ces boutons obtiennent le onClickListener, et non par une déclaration anonyme, il existe une classe qui implémente l'écouteur. S'il y a un clic sur un certain bouton, l'activité où tout cela arrive, devrait finir.

Je ne suis pas surpris qu'appeler finish() dans la classe de bouton ne fonctionne pas. activityContext.finish ne fonctionne pas non plus.

Alors, comment puis-je gérer cela?

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; 

    } 



} 

}

+0

Essayez getActivity(). Finish(); Voir ceci: https://stackoverflow.com/questions/4594996/activity-finish-called-but-activity-stays-loaded-in-memory – MatiRC

Répondre

1

public class DetailActvityActionBtn implements View.OnClickListener

Vous n'êtes pas étendez Activity ou Fragment ou quoi que ce soit le long de ces lignes, vous avez pas de contexte pour exécuter context.finish(); à partir parce que finish() est une méthode de Activity.

Si cette classe est utilisée à partir d'un Activity alors passer que la référence de l'activité au constructeur de la classe, comme ceci:

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(); 
} 
0

Personnellement, je suggère le découplage de la dépendance à l'égard du bouton sur la existence d'une activité. Plutôt que de définir la fonctionnalité d'onClick dans la classe Button, pourquoi ne pas définir la fonctionnalité dans votre contrôleur (Activity)? Vous pouvez définir une méthode onClick et utiliser votre logique listview pour déterminer quels boutons devraient avoir cette fonctionnalité.

Si vous contrôliez simplement la logique métier, ce serait une chose, mais je pense personnellement qu'il est compliqué de voir la vue définir le cycle de vie du contrôleur. Le contrôleur peut donner la permission au bouton de se fermer, mais de toute autre manière et le bouton commence à parler à des choses qu'il ne devrait probablement pas. Peut-être que vous suivez un paradigme différent de MVC, donc je peux me tromper!

Je pensais quelque chose le long des lignes de:

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

dirais certainement pas que c'est la meilleure solution, mais peut-être cela pourrait vous mettre dans la bonne direction. Quelqu'un a-t-il des critiques?

1

Diffusez le contexte de votre activité dans une activité. Et puis appelez méthode de fin

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