2012-03-26 21 views
1

説明が少し難しい問題があります。私は旅行計画のためのアンドロイドアプリケーションを構築しています。私は、マップ項目といくつかの他のボタンとサーバーとの通信が完了し、パスが地図上に表示されるAsyncTaskクラスを含む主なアクティビティを持っています。私はsqlliteデータベースでサーバーからの応答を保存することによって、オフラインで作業しようとしています。Android:onClickメソッドのあるアクティビティから別のアクティビティにオブジェクトを渡してAsyncTaskクラスに使用する方法

私はMainActivityというアクティビティを持っています。そこに、私はメニュー項目

public boolean onOptionsItemSelected(final MenuItem pItem) {   
    switch (pItem.getItemId()) { 
    case R.id.recent_trips: 
      startActivity(new Intent(this, recentTripsActivity.class)); 
      break; 
    default: 
      break; 
     } 

     return false; 
    } 
} 

ための方法を持ってここで私は、メニューボタンからrecent_tripsをクリックすると

btnPlanTrip.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     tripReq = new TripRequest(MainActivity.this,activityHandler,db); 
    tripReq.execute(request); 
    } 
    }); 
} 

は、recentTripsActivityが開きAsyncTaskクラスを呼び出すための現在の方法です。基本的には、このクラスではmysqlliteデータベースからいくつかのデータを取得し、それをアダプタを介してlistViewに表示します。そこには、リスト項目がクリックされたときに特定の値(res = listItem.getofflineResult();)を取るメソッドview.setOnClickListenerがあります。メインアクティビティでこの値を使用したいと思います(詳細は下記を参照してください)。 ここにコードがあります。

public class recentTripsActivity extends Activity implements Serializable { 
    private ImageButton stopSearch; 
    private AutoCompleteTextView searchField; 
    SQLiteDatabase db; 
    OfflineTripRequest tripReq; 
    String res; 
    //db = openOrCreateDatabase("AndroidDatabase.db", SQLiteDatabase.CREATE_IF_NECESSARY, null); 


    private ListView listview; 
    private ArrayList mListItem; 
    ItemBO listItem; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
      setContentView(R.layout.recent_trips); 

      //open database connection 
      db = openOrCreateDatabase("AndroidDatabase.db", SQLiteDatabase.CREATE_IF_NECESSARY, null); 
      int i=0; 
      String [] str={"id","description","offlineResult"}; 
      listview = (ListView) findViewById(R.id.lview_trips); 

      mListItem = new ArrayList<ItemBO>(); 

      Cursor cursor = db.query("tbl_offlinePathResult",str, null, null, null, null, null); 

      cursor.moveToFirst(); 
      while (!cursor.isAfterLast()) { 
       i++; 
       ItemBO listItem = new ItemBO(i,cursor.getString(1),cursor.getString(2)); 
       mListItem.add(listItem); 
       cursor.moveToNext(); 
       if(i==10){ 
        break; 
       } 
      } 
      // Make sure to close the cursor 
      cursor.close(); 
      i++; 

      listview.setAdapter(new ListAdapter(recentTripsActivity.this, R.id.lview_trips,mListItem)); 
      db.close(); 
    } 


//***ListAdapter*** 
class ListAdapter extends ArrayAdapter { //--CloneChangeRequired 
    private ArrayList mList; //--CloneChangeRequired 
    private Context mContext; 

    @SuppressWarnings("unchecked") 
    public ListAdapter(Context context, int textViewResourceId, 
      ArrayList list) { //--CloneChangeRequired 
     super(context, textViewResourceId, list); 
     this.mList = list; 
     this.mContext = context; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = convertView; 
     try { 
      if (view == null) { 
       LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       view = vi.inflate(R.layout.list_item_saved_paths, null); //--CloneChangeRequired(list_item) 
      } 
      final ItemBO listItem = (ItemBO) mList.get(position); //--CloneChangeRequired 
      if (listItem != null) { 
       // setting list_item views 
       ((TextView) view.findViewById(R.id.tv_name)) 
         .setText(listItem.getDescription()); 

       view.setOnClickListener(new OnClickListener() { 
        public void onClick(View arg0) { //--clickOnListItem 
         res=listItem.getofflineResult(); 

        } 
       }); 
      } 
     } catch (Exception e) { 
      Log.i(recentTripsActivity.ListAdapter.class.toString(), e.getMessage()); 
     } 
     return view; 
    } 
} 
} 

私はAsyncTaskクラスを呼び出し、そのクラスにそのデータを渡したいことやった後MainActivityに。(RES = listItem.getofflineResult()上記のデータを渡したいと思います。どのようにすることができます私はlistItemをクリックすることでこれを行うのですか?地図がMainActivityにある前に言ったように、別のアクティビティからクリックが発生します。 ご質問がありましたらご遠慮なくご相談ください

答えて

1

まず、あなたはあなたのリストにonListItemClickオーバーライドする必要があります。必要な情報をバンドルに入れ、アクティビティを終了する必要があります。このバンドルは、そのアクティビティのonActivityReusltメソッド(これをオーバーライドする必要があります)の呼び出し元アクティビティに「返されます」。参照:

Passing Data Between Activities

+0

ありがとうございました。 –

+0

@phedonrousouうれしいことを聞いてうれしいです。 :) –

1

私は通常、アンドロイドアプリでデータを渡すときにシングルトンメソッドを使用します。あなたがよく知らない人は、基本的には常に同じインスタンスを返す静的クラスです。これにより、すべて同じデータを共有するクラスの複数の「インスタンス」を作成できます。

Singleton Design Pattern

1

さてあなたは、(文字列を?)RESを渡すことができ、多くの点で、シンプルでスロー好みです:

SharedPreferences settings = context.getSharedPreferences(APPNAME, 0); 
SharedPreferences.Editor editor = settings.edit(); 
    editor.putString("res", res); 
    editor.commit(); 

、その後MainActiviyで取得:

SharedPreferences settings = context.getSharedPreferences(APPNAME, 0); 
res = settings.getString("res",""); 

ますローカルデータベースに保存することもできますし、静的変数と抽象変数を使用して "tkcsam"のように指定することもできます。

public abstract Global{ 
public static String res; 
} 

、あなたはどのような活動にアセスすることができます

Global.res = "A" 
関連する問題