在所有Android活动中保持变量值

我有一个数据库,其中包含一行数据,可用于多个活动.我需要能够在所有活动中保留行ID,以便我可以使用我的数据库适配器在不同的活动中读取和写入数据.我已成功使用putExtra(Overthelimit. java)通过意图将行id传递给下一个活动.然后使用getExtra(Profile.java)为mRowId变量赋予行id.我现在的问题是让mRowId可用于其他活动,即MyUsual和DrinksList,所以我可以随时更新数据.

你可以看到我尝试过putExtras,putSerializable但是无法让它工作.我想我错过了一些理解.

因此,对于我在下面的活动中的配置文件菜单选项,我可以将光标行id的值发送到Profile类:

public class Overthelimit extends ListActivity {
private OverLimitDbAdapter dbHelper;
private Cursor cursor;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    this.getListView();
    dbHelper = new OverLimitDbAdapter(this);
    dbHelper.open();
    fillData();
    registerForContextMenu(getListView());
}


@Override
protected void onActivityResult(int requestCode,int resultCode,Intent intent) {
    super.onActivityResult(requestCode,resultCode,intent);
    fillData();

}
private void fillData() {
    cursor = dbHelper.fetchAllUserDrinks();
    startManagingCursor(cursor);
    //cursor.getCount();    

    String[] from = new String[] { OverLimitDbAdapter.KEY_USERNAME };
    int[] to = new int[] { R.id.label };

    // Now create an array adapter and set it to display using our row
    SimpleCursorAdapter notes = new SimpleCursorAdapter(this,R.layout.user_row,cursor,from,to);
    setlistadapter(notes);
}



@Override
protected void onDestroy() {
    super.onDestroy();
    if (dbHelper != null) {
        dbHelper.close();
    }
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu,menu);
    return true;
} 

@Override
public boolean onoptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) {
    case R.id.profile:
        Intent myIntent1 = new Intent(this,Profile.class);
        if(cursor.getCount() != 0) {
            //Toast.makeText(getApplicationContext(),"no profile",Toast.LENGTH_SHORT).show();
            myIntent1.putExtra(OverLimitDbAdapter.KEY_ROWID,cursor.getString(cursor.getColumnIndexOrThrow(OverLimitDbAdapter.KEY_ROWID)));
        }
        startActivityForResult(myIntent1,0);
        return true;
    case R.id.myusual:
        Intent myIntent2 = new Intent(this,MyUsual.class);
        startActivityForResult(myIntent2,0);
        return true;
    case R.id.trackme:
        Intent myIntent3 = new Intent(this,TrackMe.class);
        startActivityForResult(myIntent3,0);
        return true;
    case R.id.moreinfo:
        Intent myIntent4 = new Intent(this,MoreInfo.class);
        startActivityForResult(myIntent4,0);
        return true;


    }
    return super.onoptionsItemSelected(item);
}

}

然后在我的个人资料活动中将其作为mRowId提供:

mRowId = (bundle == null) ? null :
                (Long) bundle.getSerializable(OverLimitDbAdapter.KEY_ROWID);
             if (mRowId == null) {
                Bundle extras = getIntent().getExtras();
                mRowId = extras != null ? Long.parseLong(extras.getString(OverLimitDbAdapter.KEY_ROWID))
                                        : null;
            }

然后,我需要将此mRowId用于MyUsual中另一个名为DrinkList的活动.所以我在下面的MyUsual上使用了onLinner上的drink1按钮来尝试将行ID发送到DrinksList:

public class MyUsual extends Activity {
private Long mRowId;
private OverLimitDbAdapter mDbHelper;
private Cursor cursor;
private TextView mDrink1Label;
private TextView mDrink1Units;

/** Called when the activity is first created. */
@Override
public void onCreate(final Bundle bundle) {
    super.onCreate(bundle);
    mDbHelper = new OverLimitDbAdapter(this);
    mDbHelper.open();
    setContentView(R.layout.my_usual);
    mDrink1Label = (TextView) findViewById(R.id.drink1Label);
    mDrink1Units = (TextView) findViewById(R.id.drink1Units);




    Button drink1 = (Button) findViewById(R.id.drink1Button);

    // get intent data i.e. which drink button pressed and mRowId                
          mRowId = (bundle == null) ? null :
            (Long) bundle.getSerializable(OverLimitDbAdapter.KEY_ROWID);
         if (mRowId == null) {
            Bundle extras = getIntent().getExtras();
            mRowId = extras != null ? Long.parseLong(extras.getString(OverLimitDbAdapter.KEY_ROWID))
                                    : null;
        }           

        //populateFields();

        drink1.setonClickListener(new View.OnClickListener() {
         public void onClick(View view) {   
             setResult(RESULT_OK);
                //finish();
                Intent myIntent1 = new Intent(view.getContext(),DrinksList.class);
                myIntent1.putExtra("drinkButton","drink1");

                if(cursor.getCount() != 0) {
                    myIntent1.putExtra(OverLimitDbAdapter.KEY_ROWID,cursor.getString(cursor.getColumnIndexOrThrow(OverLimitDbAdapter.KEY_ROWID)));
                }

             startActivityForResult(myIntent1,0);
         }

        });




}

protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            //saveState();
            outState.putSerializable(OverLimitDbAdapter.KEY_ROWID,mRowId);
        }   
}

从DrinksList我选择一个饮料,我需要使用mRowId通过onListItemclick将数据写入数据库

public class DrinksList extends ListActivity {
private ProgressDialog m_ProgressDialog = null; 
private ArrayList<CreateDrinkOption> m_drinks = null;
private DrinkAdapter m_adapter;
private Runnable viewDrinks;
private String drinkButton;
private Long mRowId;
private OverLimitDbAdapter mDbHelper;
private String databaseRow;
private Cursor cursor;

/** Called when the activity is first created. */

@Override
 public void onCreate(Bundle bundle) {
     super.onCreate(bundle);
     setContentView(R.layout.drinks_list);
     mDbHelper = new OverLimitDbAdapter(this);
     mDbHelper.open();
     m_drinks = new ArrayList<CreateDrinkOption>();
     this.m_adapter = new DrinkAdapter(this,R.layout.drink_row,m_drinks);
             setlistadapter(this.m_adapter);


     viewDrinks = new Runnable(){
         @Override
         public void run() {
             getDrinks();
         }
     };
 Thread thread =  new Thread(null,viewDrinks,"MagentoBackground");
     thread.start();
     m_ProgressDialog = ProgressDialog.show(DrinksList.this,"Please wait...","Retrieving data ...",true);



// get intent data i.e. which drink button pressed and mRowId                
     mRowId = (bundle == null) ? null :
        (Long) bundle.getSerializable(OverLimitDbAdapter.KEY_ROWID);
     if (mRowId == null) {
        Bundle extras = getIntent().getExtras();
        drinkButton = extras.getString(drinkButton);
        mRowId = extras != null ? Long.parseLong(extras.getString(OverLimitDbAdapter.KEY_ROWID))
                                : null;
    }


 }

protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    //saveState();
    outState.putSerializable(OverLimitDbAdapter.KEY_ROWID,mRowId);
}


 private Runnable returnRes = new Runnable() {

     @Override
      public void run() {
          if(m_drinks != null && m_drinks.size() > 0){
              m_adapter.notifyDataSetChanged();
              for(int i=0;i<m_drinks.size();i++)
              m_adapter.add(m_drinks.get(i));
          }
          m_ProgressDialog.dismiss();
          m_adapter.notifyDataSetChanged();
      }
    };

    @Override
    protected void onListItemClick(ListView l,View v,int position,long id)
    {
    try
    {
    super.onListItemClick(l,v,position,id);
    CreateDrinkOption bkg = (CreateDrinkOption)l.getItemAtPosition(position);
    String drink1type = bkg.getDrinkType().toString();
    float drink1units = (bkg.getPercentageByVolume() * bkg.getVolume());
    //Toast.makeText(this,mRowId.toString(),Toast.LENGTH_LONG).show();

    mDbHelper.updateDrink(mRowId,drink1type,drink1units); 
    finish();

    }
    catch(Exception ex)
    {
    Toast.makeText(this,"error",Toast.LENGTH_LONG).show();
    }

   }



 private void getDrinks(){
     try{
         m_drinks = new ArrayList<CreateDrinkOption>();
         CreateDrinkOption o1 = new CreateDrinkOption();
         o1.setDrinkType("Beer - 1 pint");
         o1.setPercentageByVolume((float) 4.5);
         o1.setVolume((float) 0.5);
         m_drinks.add(o1);
         CreateDrinkOption o2 = new CreateDrinkOption();
         o2.setDrinkType("Wine - small glass");
         o2.setPercentageByVolume((float) 12);
         o2.setVolume((float) 0.125);
         m_drinks.add(o2);
         CreateDrinkOption o3 = new CreateDrinkOption();
         o3.setDrinkType("Spirit - single");
         o3.setPercentageByVolume((float) 40);
         o3.setVolume((float) 0.25);
         m_drinks.add(o3);
         CreateDrinkOption o4 = new CreateDrinkOption();
         o4.setDrinkType("Alcopop - bottle");
         o4.setPercentageByVolume((float) 5);
         o4.setVolume((float) 0.275);
         m_drinks.add(o4);
            Thread.sleep(1000);
         Log.i("ARRAY",""+ m_drinks.size());
       } catch (Exception e) { 
        Log.e("BACKGROUND_PROC",e.getMessage());
       }
       runOnUiThread(returnRes);
   }   

 private class DrinkAdapter extends ArrayAdapter<CreateDrinkOption> {

     private ArrayList<CreateDrinkOption> items;

     public DrinkAdapter(Context context,int textViewResourceId,ArrayList<CreateDrinkOption> items) {
              super(context,textViewResourceId,items);
              this.items = items;
      }

     @Override
      public View getView(int position,View convertView,ViewGroup parent) {
              View v = convertView;
              if (v == null) {
                  LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                  v = vi.inflate(R.layout.drink_row,null);
              }
              CreateDrinkOption o = items.get(position);
              if (o != null) {
                      TextView tt = (TextView) v.findViewById(R.id.drinkdetail);
                      TextView bt = (TextView) v.findViewById(R.id.drinkunits);
                      if (tt != null) {
                            tt.setText("Type: "+o.getDrinkType());
                      }
                      if(bt != null){
                            bt.setText("Units: "+ String.valueOf(o.getPercentageByVolume() * o.getVolume()));
                      }
              }
              return v;


    }

 } 


}

对于长篇文章感到抱歉,但我需要做的就是让mRowId的这个值可用于所有活动,这样我就可以在任何时候读/写数据.如果应用程序通过拨打来电暂停或中断,数据也需要在那里,所以我使用onSaveInstanceState.

好,谢谢.所以回复很好的答案,我已经完成了这个,但它崩溃试图获取数据.我将此作为我的Application类:

public class OverthelimitApplication extends Application {
private Long rowId;
public Long getRowId() {
    return rowId;
}
public void setRowId(Long value) {
    rowId = value;
}
}

然后用这个设置值:

OverthelimitApplication app1 = (OverthelimitApplication)getApplicationContext();
    app1.setRowId((long) cursor.getColumnIndexOrThrow(OverLimitDbAdapter.KEY_ROWID));

然后试着用这个获得价值并且它崩溃了:

mRowId = ((OverthelimitApplication) getApplicationContext()).getRowId();

我修好了!使用这个集合得到:

app1.setRowId(Long.parseLong(cursor.getString(cursor.getColumnIndexOrThrow(OverLimitDbAdapter.KEY_ROWID))));

mRowId = (long)((OverthelimitApplication)getApplicationContext()).getRowId();

设置和获取时我仍然必须指定长时间.感谢您的输入.

解决方法

另一种方法是创建一个可用于所有活动的应用程序类.
要做到这一点,你必须扩展你的Manifest
<application
    ..
    android:name=".MyApplication" >

并创建一个新类

public class MyApplication extends Application {
public int rowId = 0;
}

在活动内部,您可以访问rowId

int mRowId = ((MyApplication) getApplicationContext()).rowId;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android岛屿数量算...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Andro...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android数据压缩的方法是什么”文章能帮助大家解决疑惑...
这篇“Android怎么使用Intent传大数据”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅...
本文小编为大家详细介绍“Android事件冲突怎么解决悬浮窗拖拽问题”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android事件冲突怎么解决悬浮窗拖拽问题”文...
这篇文章主要介绍了Android拼接如何实现动态对象的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android拼接如何实现动态对象文...
今天小编给大家分享一下Android全面屏适配怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下...
本篇内容介绍了“Android怎么开发Input系统触摸事件分发”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何...
今天小编给大家分享一下AndroidRoom怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下...
本文小编为大家详细介绍“AndroidRoom使用方法有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“AndroidRoom使用方法有哪些”文章能帮助大家...
这篇文章主要介绍“Android中的OpenGL怎么配置使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android中的Open...
这篇文章主要介绍了Android如何自定义自动识别涂鸦工具类的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android如何自定义自动...
今天小编给大家分享一下Android如何自定义有限制区域的图例角度自识别涂鸦工具类的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以...
今天小编给大家分享一下ReactNative错误采集原理在Android中如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章...
这篇文章主要讲解了“Android崩溃日志收集和保存代码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“A...
这篇“Android面向单Activity开发实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大...
本篇内容介绍了“Android应用启动白屏处理的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何...