2017-07-11 2 views
0

Es gibt eine Aktivität, die listItems anzeigt (über einen cursorAdapter).Call finish() innerhalb einer View.OnClickListener-Implementierungsklasse

Das XML des ListItems enthält einige Schaltflächen. In der newView() Methode des Cursoradapters erhalten diese Schaltflächen die onClickListener, nicht durch eine anonyme Deklaration, gibt es eine Klasse, die den Listener implementiert. Wenn auf einen bestimmten Knopf geklickt wird, sollte die Aktivität, bei der alles passiert, beendet sein.

Ich bin nicht überrascht, dass Aufruf finish() in der Button-Klasse nicht funktioniert. activityContext.finish funktioniert auch nicht.

Also, wie kann ich das schaffen?

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

Versuchen Sie getActivity(). Finish(); Siehe hierzu: https://stackoverflow.com/questions/4594996/activity-finish-called-but-activity-stays-loaded-in-memory – MatiRC

Antwort

1

public class DetailActvityActionBtn implements View.OnClickListener

Sie sind nicht Activity oder Fragment oder irgendetwas in dieser Richtung erstreckt, haben Sie keinen Kontext context.finish(); aus auszuführen, da finish() ist eine Methode aus Activity.

Wenn diese Klasse von einem Activity verwendet wird, gelangen dann in dieser Literaturaktivität an den Konstruktor der Klasse, etwa so:

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

Persönlich würde ich vorschlagen, der Schaltfläche Vertrauen auf die Entkopplung Existenz einer Aktivität. Anstatt die Funktionalität von onClick innerhalb der Button-Klasse zu definieren, warum definieren Sie nicht die Funktionalität in Ihrem Controller (Activity)? Sie können eine onClick-Methode definieren und mithilfe Ihrer ListView-Logik bestimmen, welche Schaltflächen diese Funktionalität haben sollen.

Wenn Sie nur Business-Logik steuern, wäre das eine Sache, aber ich persönlich denke, es ist verwickelt, um die Ansicht zu definieren, den Controller-Lebenszyklus. Der Controller kann dem Knopf erlauben, sich selbst zu entlassen, aber auf jede andere Art und Weise und der Knopf beginnt mit Dingen zu reden, die er wahrscheinlich nicht tun sollte. Vielleicht folgst du einem anderen Paradigma als MVC, also könnte ich mich irren!

Ich dachte, etwas entlang der Linien von:

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

Würde auf jeden Fall nicht sagen, es ist die beste Lösung, aber vielleicht könnte dies Sie in die richtige Richtung gestellt. Wer hat Kritik?

1

Geben Sie Ihren Aktivitätskontext in eine Aktivität ein. Und dann Anruf beenden Methode

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