2017-07-11 19 views
0

(cursorAdapterを使用して)listItemsを表示するアクティビティがあります。View.OnClickListener実装クラス内でfinish()を呼び出す

listItemのXMLにはいくつかのボタンが含まれています。カーソルアダプタのnewView()メソッドでは、これらのボタンは匿名宣言ではなく、onClickListenerを取得します。リスナーを実装するクラスがあります。特定のボタンにクリックがある場合、そのすべてのアクティビティが終了するはずです。

ボタンクラスの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; 

    } 



} 

}

+0

getActivity()。finish();を試してください。これを見てください:https://stackoverflow.com/questions/4594996/activity-finish-called-but-activity-stays-loaded-in-memory – MatiRC

答えて

1

public class DetailActvityActionBtn implements View.OnClickListener

あなたはfinish()Activityからの方法ですので、あなたがからcontext.finish();を実行するための何のコンテキストを持っていない、これらの線に沿ってActivityまたはFragmentか何かを拡張されていません。

このクラスはActivityから利用されている場合は、そのように、クラスのコンストラクタにそのアクティビティの参照を渡す:個人的に

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

、私は時にボタンの依存を切り離すことをお勧め活動の存在。 Buttonクラス内でonClickの機能を設定するのではなく、コントローラ内の機能を定義しないでください(アクティビティ)。 1つのonClickメソッドを定義して、リストビューロジックを使用して、どのボタンにこの機能が必要かを判断できます。

単純にビジネスロジックを制御していれば、それは1つのことになりますが、個人的には、コントローラのライフサイクルを定義するビューを持っていると思います。コントローラーは、ボタンを自分自身を却下する権限を与えることができますが、それ以外の方法でボタンを押すと、そうしてはいけないことが話題になります。多分あなたはMVCとは違うパラダイムに従っているので、私は間違っているかもしれません!

私はの線に沿って何かを考えていた:

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

は間違いなく、それが最善の解決策だと言うではないだろうが、多分これが正しい方向にあなたを置くことができます。誰でも批判はありますか?

1

アクティビティコンテキストをアクティビティに型キャストします。呼び出し終了メソッド

Activity act=(Activity)context; 
act.finish(); 
関連する問題