【问题标题】:Having difficulty with a global variable in android application在 android 应用程序中使用全局变量有困难
【发布时间】:2011-04-28 01:00:21
【问题描述】:

嘿,我在声明、更改和使用全局变量时遇到问题。我尝试了整个“创建一个扩展您的应用程序并将变量放在那里的类”的事情,但我不确定如何实现它。这是我的类,里面有变量。

    public class MyApp extends Application {

    public int listPos;

}

然后我尝试在此处访问和更改 int listPos。

public class Browse extends ListActivity{
MyApp app = ((MyApp)getApplicationContext());

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  String[] coffeeTypes = getResources().getStringArray(R.array.coffeeTypes);
  setListAdapter(new ArrayAdapter<String>(this, R.layout.listview, coffeeTypes));

  ListView lv = getListView();
  lv.setTextFilterEnabled(true);

  lv.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view,
        int position, long id) {
        app.listPos = position;
        startActivity(new Intent(Browse.this, CoffeeTypes.class));

    }
  });
}

}

然后我尝试访问以下活动中的变量以确定 if else 语句的结果

public class CoffeeTypes extends Activity{
MyApp app = ((MyApp)getApplicationContext());

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  if(app.listPos == 0){
      Toast.makeText(this, "WEEEEEEE!0", Toast.LENGTH_LONG).show();
  }
  else if(app.listPos == 1){
      Toast.makeText(this, "RAWR!1", Toast.LENGTH_LONG).show();

有人知道我做错了什么吗?

【问题讨论】:

    标签: android class variables global


    【解决方案1】:

    您可以通过一些修改来使用 soorya 的答案。我个人仍然会使用您的 myApp 类,但将 listPos 更改为 static 并以这种方式访问​​它。这样做可以让您在需要时使用 Application 类 onCreate 方法来初始化值(尽管在本示例中不需要)或其他 Android 方法。

    public class MyApp extends Application {
    
        public static int listPos;
    
    }
    
    //~~ Elsewhere:
    MyApp.listPos = 5; //etc
    

    但这不是处理您的问题类型的最佳方法。

    您应该通过Intent 传递列表位置信息(或单击的项目的ID,或者您正在处理您的数据)。

    不要使用全局变量来跟踪此信息,而是将其保持在 Intent 的本地:

    public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
            //app.listPos = position;
            Intent intent = new Intent(Browse.this, CoffeeTypes.class);
            intent.putExtra("position", position);
            startActivity(intent);
            //startActivity(new Intent(Browse.this, CoffeeTypes.class));
    
        }
    

    这会将位置数据通过 Intent 传递给新的 Activity。在您的 CoffeeTypes Activity 中,您应该从以下内容开始:

    //in onCreate...
    int incomingPosition = getIntent().getIntExtra("position",-1));
    if(incomingPosition != -1) { //do stuff }
    

    这将从传入的 Intent 中读取“位置”数据,以便您使用它。如果不添加任何内容,则上面的 -1 是默认值。

    最后一个警告:您可能需要小心地来回发送列表位置,这取决于您的应用程序的设置方式 如果添加新项目/删除项目,列表位置可能不再引用您认为的项目它做了。如果这些咖啡类型/您使用的任何咖啡有一个单独的唯一 ID,可能更适合避免上述情况,请考虑改用它。

    【讨论】:

    • 很棒的帮助!虽然现在我的应用程序由于某种未知原因而崩溃,但你对意图的看法是正确的。容易得多。
    • @Seeshi_suin 我忘记添加 startActivity 的修改版本,现在已编辑。不过可能与您的新问题无关。
    【解决方案2】:

    我不确定这是否是 android 操作系统的可见性问题,您能否创建一个公共函数来充当变量的 getter?

    int getListPos(){ return this.listpos; }
    

    我知道您可以在上下文之间传递变量,您可能必须这样做。

    也许一个让你动起来的临时解决方法也可以是创建一个可访问变量的静态类?

    【讨论】:

      【解决方案3】:

      创建一个这样的类

      class globalClass
      {
             static int lastPos;
      }
      

      您可以使用设置值

      globalClass.lastPos = value;
      

      而get函数是

      int myVal = globalClass.lastPos;
      

      【讨论】:

        【解决方案4】:

        我通过将变量设为私有来执行应用程序变量类,然后创建公共 get() 和 set() 方法来更改变量。您可以尝试一下,但从技术上讲,您似乎做得对

        它可能出错的一个原因是因为您在 onCreate 而不是 onStartCommand 中实现这些东西。如果您在 Activity 周期的错误假设/知识下测试此功能,它可能会出错

        【讨论】:

          猜你喜欢
          • 2015-05-11
          • 2016-09-27
          • 2015-05-26
          • 2010-11-12
          • 1970-01-01
          • 2023-02-19
          • 2022-11-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多