4

我在 onCreate 有这个:

final TextView text1 = (TextView) findViewById(R.id.txtNextAlarm);

我正在尝试在同一类中的方法中设置文本:

public static void NextTxt(){
        text1.setText("");
}

但它不识别“text1”。

4

5 回答 5

7

问题是静态方法不与任何特定对象相关联,而是与整个类相关联。因此,他们只能看到您班级中的静态字段。text1如果你说的是真的,你的变量甚至不是那个。相反,它是一个局部变量,只存在于onCreate()方法的长度。如果您知道您的活动只会有一个实例(这可能不是一个不合理的假设),那么您可以做的是使用

private static TextView text1;

在你的类的顶部(或者,基本上,在方法之外的任何地方)。final修饰符不会给你带来任何东西。您可以选择将其设为公开还是私有,但默认情况下我倾向于私有(除非有其他原因)。

另一种方法是问自己为什么NextTxt()是静态的;如果你让它成为一个普通的实例方法,那么你仍然需要text1在类中声明,但它不需要是静态的。但是你需要一个实例来调用它。

于 2013-02-20T22:37:44.797 回答
3
TextView text1;

@Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      text1 = (TextView) findViewById(R.id.txtNextAlarm);
}

在 onCreate 方法中进行初始化。

于 2013-02-20T22:29:12.667 回答
1

如果方法是静态的,则不能访问该类的任何非静态字段。您必须将 textField 设为静态或将其作为参数传递。

static TextView text1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MyClass.text1 = (TextView) findViewById(R.id.txtNextAlarm);
}

public static void NextTxt(){
    MyClass.text1.setText("");
}

当然你一次只能设置一个 textField,因为它是类的静态字段。其他选项包括制作单例或从 NextTxt 方法中删除静态修饰符。

于 2013-02-20T22:39:30.033 回答
1

如果这条线在你的 onCreate 方法中是真的

final TextView text1 = (TextView) findViewById(R.id.txtNextAlarm);

那么问题的答案是 text1 超出了NextTxt 方法的范围。您已经在一个方法中声明并初始化了一个变量,并且您正试图从另一个方法访问它。为了让 NextTxt 方法“看到”text1,您需要将该成员移动到两个方法都可以访问它的位置。

正如其他答案中提到的,您还要处理 onCreate 是一个实例方法而 NextTxt 是一个静态方法的事实。您可能很想开始将所有内容都设置为静态以“解决”您的问题,但这是一条危险且草率的道路。您无法控制 Android 何时终止您的 UI,因此 text1 可能会在没有警告的情况下变为无效。下次您尝试对其调用方法时,您将不喜欢结果。

重新考虑您正在尝试做的事情,如有必要,将其勾画出来,如果您不理解错误,请不要只在 Eclipse 中应用快速修复。

于 2013-02-20T22:58:56.703 回答
-2

text1 是一个local变量,您必须将其声明为类的属性

public final TextView text1;

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
      text1 = (TextView) findViewById(R.id.txtNextAlarm);
}

并在您的静态方法中使用:

public static void NextTxt(){
        text1.setText("");
}
于 2013-02-20T22:34:12.167 回答