Android如何从公共静态方法中设置TextView的文本?

4

我在onCreate中有以下代码:

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

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

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

但它无法识别 "text1"。

为什么“NextTxt”需要是静态的? - Simon
@Simon,我需要从另一个类中使用那个方法。 - user1880779
1
只有当类在您的Activity中实例化,并且您可以保证该类的生命周期不超过Activity时,才将TextView的引用传递给其他类。如果无法保证生命周期,则存在严重的内存泄漏风险,请回来询问回调函数的问题。 - Simon
@Simon 嗯,感谢你的提示 Simon。这种方法会更新 TextView,我需要另一个类来触发该方法/TextView 更新?除了这种方式,还有更好的方法吗?抱歉,我是一个新手。 - user1880779
你尝试过使用runOnUiThread()吗?你可以使用它来更新任何视图。 - IgorGanapolsky
5个回答

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

在类的顶部(或者基本上在任何方法之外),使用final修饰符没有什么帮助。你可以选择将其设置为公有或私有,但我倾向于默认设置为私有(除非有其他原因)。
另一种选择是问问自己为什么NextTxt()是静态的;如果你将它作为普通实例方法,则仍需要在类中声明text1,但它不需要是静态的。但是你仍需要一个实例来调用它。

我需要在另一个类中使用NextTxt()方法,这就是为什么我需要将其设置为静态的原因吗?我看到每个人都对静态方法和变量持怀疑态度,如果我需要在另一个类中使用方法,哪种方式才是正确的呢? - user1880779
将Android上下文类(EditText、TextView等)放置在静态字段中是一个不好的想法,而且会被反对,因为它们会使您的应用程序面临内存泄漏的风险。 - Ojonugwa Jude Ochalifu

3
TextView text1;

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

在onCreate方法中进行初始化。


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方法中删除静态修饰符。

1
如果这行代码确实在你的onCreate方法中,那么……
final TextView text1 = (TextView) findViewById(R.id.txtNextAlarm);

如果你的问题是关于编程的,那么答案就是text1在NextTxt方法中超出了scope。你已经在一个方法中声明并初始化了一个变量,而你正在尝试从另一个方法中访问它。为了让NextTxt方法“看到”text1,你需要将该成员移动到两个方法都可以访问的地方。
正如其他答案中提到的,你还要处理onCreate是一个实例方法而NextTxt是一个静态方法的事实。你可能会想要开始使所有东西都变成静态的,以便“修复”你的问题,但这是一条危险和懒散的道路。你无法控制Android何时关闭你的UI,因此text1可能会在没有警告的情况下变得无效。下次你尝试调用它的方法时,你将不会喜欢结果。
重新考虑你想要做什么,如果必要的话,草拟一下,并且如果你不理解错误,不要只是在Eclipse中应用快速修复。

我需要在另一个类中使用NextTxt()方法,这就是为什么我需要将其设置为静态的原因。我看到每个人都对静态方法和变量持怀疑态度。那么,如果我需要在另一个类中使用方法,正确的做法是什么? - user1880779

-2

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

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("");
}

你不能给一个final变量赋值。它不会编译。 - StevenTB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接