Android:如何在onClick方法中将对象从一个活动传递到另一个活动,并将其用于AsyncTask类
我有一个有点难以解释的问题。我正在为旅行计划构建一个android应用程序。我有一个主活动,其中包含映射项和一些其他按钮,还有一个AsyncTask类,其中完成了与服务器的通信,并在映射上显示了路径。我试图通过将服务器的响应保存在sqllite数据库中使其脱机工作 我有一个活动叫做MainActivity。在那里,我有一个菜单项的方法Android:如何在onClick方法中将对象从一个活动传递到另一个活动,并将其用于AsyncTask类,android,android-activity,onclick,android-asynctask,Android,Android Activity,Onclick,Android Asynctask,我有一个有点难以解释的问题。我正在为旅行计划构建一个android应用程序。我有一个主活动,其中包含映射项和一些其他按钮,还有一个AsyncTask类,其中完成了与服务器的通信,并在映射上显示了路径。我试图通过将服务器的响应保存在sqllite数据库中使其脱机工作 我有一个活动叫做MainActivity。在那里,我有一个菜单项的方法 public boolean onOptionsItemSelected(final MenuItem pItem) { switch (
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;
}
}
下面是调用AsyncTask类的当前方法
btnPlanTrip.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
tripReq = new TripRequest(MainActivity.this,activityHandler,db);
tripReq.execute(request);
}
});
}
当我从菜单按钮单击最近的行程时,将打开recentTripsActivity。基本上,在这个类中,我从mysqllite数据库中检索一些数据,并通过适配器将其显示在listView中。在这里,我有一个方法view.setOnClickListener,在其中单击列表项时,我会获取一个特定的值(res=listItem.getofflineResult();)。我希望在主要活动中使用该值(有关更多详细信息,请参见下文)。
这是代码
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;
}
}
}
公共类recentTripsActivity扩展活动实现可序列化{
私人图像按钮停止搜索;
私有AutoCompleteTextView搜索字段;
sqlitedb数据库;
离线TripRequest tripReq;
字符串res;
//db=openOrCreateDatabase(“AndroidDatabase.db”,SQLiteDatabase.CREATE_,如果需要,则为null);
私有列表视图列表视图;
私人ArrayList mListItem;
项目列表项目;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.最近的行程);
//开放数据库连接
db=openOrCreateDatabase(“AndroidDatabase.db”,SQLiteDatabase.CREATE_,如果需要,则为null);
int i=0;
字符串[]str={“id”,“description”,“offlineResult”};
listview=(listview)findViewById(R.id.lview_);
mListItem=新的ArrayList();
Cursor Cursor=db.query(“tbl_offlinePathResult”,str,null,null,null,null);
cursor.moveToFirst();
而(!cursor.isAfterLast()){
i++;
itembolistItem=newitembo(i,cursor.getString(1),cursor.getString(2));
mListItem.add(列表项);
cursor.moveToNext();
如果(i==10){
打破
}
}
//确保关闭光标
cursor.close();
i++;
setAdapter(新的ListAdapter(recentTripsActivity.this,R.id.lview_trips,mListItem));
db.close();
}
//***列表适配器***
类ListAdapter扩展ArrayAdapter{/--CloneChangeRequired
private ArrayList mList;/--clonechange必需
私有上下文;
@抑制警告(“未选中”)
公共ListAdapter(上下文上下文,int textViewResourceId,
ArrayList列表){/--CloneChangeRequired
super(上下文、textViewResourceId、列表);
this.mList=列表;
this.mContext=上下文;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=转换视图;
试一试{
如果(视图==null){
LayoutInflater vi=(LayoutInflater)getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
视图=vi.充气(R.layout.list_item_saved_paths,null);/--CloneChangeRequired(list_item)
}
final ItemBO listItem=(ItemBO)mList.get(position);/--CloneChangeRequired
如果(listItem!=null){
//设置列表项目视图
((TextView)view.findviewbyd(R.id.tv_name))
.setText(listItem.getDescription());
view.setOnClickListener(新的OnClickListener(){
单击(视图arg0){/--clickOnListItem时公共无效
res=listItem.getofflineResult();
}
});
}
}捕获(例外e){
Log.i(recentTripsActivity.ListAdapter.class.toString(),e.getMessage());
}
返回视图;
}
}
}
我想传递上面提到的数据(res=listItem.getofflineResult()到MainActivity。完成后,我想调用一个AsyncTask类并将该数据传递给该类。我如何通过单击listItem来完成这一切?正如我之前所说,映射是在MainActivity上,但单击将从不同的活动中发生。
我希望我说得足够清楚,如果你有任何问题,请问我在android应用程序中传递数据时,我通常使用单例方法。如果你不熟悉,它基本上是一个静态类,总是返回相同的实例。这允许你创建多个共享相同数据的类“实例” 您可以通过多种方式传递res(字符串?),最简单的是抛出首选项:
SharedPreferences settings = context.getSharedPreferences(APPNAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString("res", res);
editor.commit();
然后在MainActivity中获得:
SharedPreferences settings = context.getSharedPreferences(APPNAME, 0);
res = settings.getString("res","");
您还可以保存在本地数据库中,或者像“tkcsam”所说的使用静态和抽象变量
public abstract Global{
public static String res;
}
您可以参加任何活动,如:
Global.res = "A"
首先,您需要覆盖列表中的onListItemClick。然后,您需要将所需信息放入捆绑包并结束活动。此捆绑包将“返回”到该活动的onActivityReuslt方法中的调用活动(您需要覆盖该方法)。请参阅: