【问题标题】:Android How to Set Text in TextView from A Public Static Method?Android 如何通过公共静态方法在 TextView 中设置文本?
【发布时间】:2013-02-06 02:52:46
【问题描述】:

我在 onCreate 中有这个:

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

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

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

但它无法识别“text1”。

【问题讨论】:

  • 为什么NextTxt 需要是静态的?
  • @Simon 我需要使用另一个类的方法
  • 如果(且仅当)类在您的 Activity 中被实例化,并且您可以保证该类的生命周期不大于 Activity,然后将对 TextView 的引用传递给另一个类。如果您不能保证生命周期,那么您将面临严重的内存泄漏风险,所以回来询问回调。
  • @Simon 嗯谢谢西蒙的提示。此方法更新 TextView 并且我需要其他类来触发该方法/ TextView 更新?除了这种方式之外,还有什么更好的方法呢?抱歉,我是新手。
  • 你试过runOnUiThread()吗?您可以使用它来更新任何视图。

标签: java android methods textview


【解决方案1】:
TextView text1;

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

在 onCreate 方法中进行初始化。

【讨论】:

    【解决方案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("");
    }
    

    【讨论】:

    • 您不能为最终变量赋值。它不会构建
    【解决方案3】:

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

    private static TextView text1;
    

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

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

    【讨论】:

    • 我需要在另一个类中使用 NextTxt() 方法,这就是为什么我需要将其设为静态?我看到每个人都对静态方法和变量持怀疑态度,如果我需要在另一个类中使用方法,这才是正确的方法?
    • 将 Android Context 类(EditText、TextView 等)放在静态字段中是个坏主意,而且不受欢迎,因为它们会使您的应用程序面临内存泄漏。
    【解决方案4】:

    如果方法是静态的,则不能访问该类的任何非静态字段。您必须将 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 方法中删除静态修饰符。

    【讨论】:

      【解决方案5】:

      如果此行在您的 onCreate 方法中是真的

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

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

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

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

      【讨论】:

      • 我需要在另一个类中使用 NextTxt() 方法,这就是我需要将其设为静态的原因。我看到每个人都对静态方法和变量持怀疑态度。那么,如果我需要在另一个类中使用方法,那么正确的做法是什么?
      猜你喜欢
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 2012-02-11
      • 2021-10-25
      相关资源
      最近更新 更多