2013-02-20 49 views
2

我有这样的的onCreate:Android如何使用公共静态方法在TextView中设置文本?

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

我试图在处于同一类中的方法来设置文本:

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

但它不承认“的text1 ”。

+0

为什么'NextTxt'需要是静态的? – Simon 2013-02-20 22:44:25

+0

@Simon我需要从另一个类中使用该方法 – user1880779 2013-02-20 22:56:29

+1

*如果*(且仅限于)该类在您的Activity中实例化并且可以*保证*该类的生命周期不大于该Activity,则将一个引用传递给TextView转换为其他类。如果你无法保证一生的话,那么你就会冒着严重的内存泄漏的风险,所以回过头来问一下回调。 – Simon 2013-02-20 23:06:30

回答

6

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

private static TextView text1; 

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

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

+0

我需要在另一个类中使用NextTxt()方法,这就是为什么我需要将其设置为静态?我发现每个人都对静态方法和变量持怀疑态度,如果我需要在另一个类中使用方法,这是正确的方法吗? – user1880779 2013-02-22 22:11:18

+0

您节省了我的时间 – Thamaraiselvam 2016-01-18 19:19:24

+0

在静态字段中放置Android上下文类(EditText,TextView e.t.c)是一个坏主意,因为它们将应用程序暴露于内存泄漏而令人不悦。 – 2016-11-02 08:01:08

3
TextView text1; 

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

在onCreate方法中进行初始化。

0

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

如果该方法是静态的,则不能访问该类的任何非静态字段。你必须让你的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(""); 
} 

当然,你只能有一个文本框设置的时候,因为它是类的静态字段。其他选项包括从NextTxt方法中创建单例或删除静态修饰符。

1

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

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

再回答你的问题是,text1为出scope从NextTxt方法中。你已经在一个方法中声明并初始化了一个变量,并且你试图从另一个方法访问它。为了使NextTxt方法“看到”text1,您需要将该成员移动到两个方法均可访问它的位置。

正如其他答案中所提到的,您也正在处理的事实是,onCreate是一个实例方法,而NextTxt是一个静态方法。为了“解决”你的问题,你可能会试图让所有事情都变成静态的,但这是一条危险且渺茫的路径。您无法控制Android杀死您的用户界面的时间,因此text1可能会在无警告的情况下失效。下一次尝试调用其上的方法时,您不会喜欢结果。

重新思考你正在尝试做什么,如果需要的话将其绘制出来,如果你不明白错误,就不要在Eclipse中应用快速修复。

+0

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

相关问题