【问题标题】:calling methods from other classes从其他类调用方法
【发布时间】:2012-02-12 09:24:39
【问题描述】:

嘿,我需要一些帮助来解释为什么我不能从 ClassTwo 调用 changeText() 这是classOne

public class ClassOne extends Activity {
    /** Called when the activity is first created. */
    ClassTwo classTwo = new ClassTwo();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        classTwo.changeText();

    }
}

这里是classTwo

public class ClassTwo extends ClassOne {    
    public void changeText(){
        TextView textOne = (TextView) findViewById(R.id.textview1);
    textOne.setText("this is how we call methods from other classes");
    }
}

错误在

com.game.ClassTwo.<init>(ClassTwo.java:5)
com.game.ClassTwo.<init>(ClassOne.java:10)

【问题讨论】:

  • findViewById() 只能在您的活动类中工作。

标签: android class extends


【解决方案1】:

问题在于,虽然ClassTwo 扩展了ClassOne,但您的实例classTwo 并未正确初始化为活动。它不是视图层次结构的一部分,因此findViewById 不会返回任何内容。 (您不应该通过调用 new 创建 Activity 子类的实例,并期望任何 Android 方法做任何有用的事情。)

重新设计您的代码,使 ClassTwo 不是 Activity 子类,并重新设计 changeText() 以接受 Activity 实例作为参数。例如:

package com.game;
import android.widget.TextView;
public class ClassTwo {
    public void changeText(ClassOne activity) {
        TextView textOne = (TextView) activity.findViewById(R.id.textview1);
        textOne.setText("this is how we call methods from other classes");
    }
}

【讨论】:

  • 谢谢,但我如何在 ClassOne 中调用它?它只是调用 changeText() 吗?
  • 正如阿迪尔所说,只做 ClassTwo.changeText(this);
【解决方案2】:

ClassTwoClassOne 的子级。它应该是同一种对象。默认示例是家具。你有一个 Table 类 (classone) 和一个 KitchenTable 类,这显然是 table 的孩子。

现在很容易看出,厨房桌子可以做与桌子相同的事情,但您要做的是在桌子类中调用厨房桌子代码。这很奇怪,因为并非所有桌子实际上都是厨房桌子。如果这张桌子是野营桌呢?

所以回到现实世界:如果你想要这个结构,你应该在 classtwo self.如果你不这样做,那么你可能想要一些不以这种扩展方式释放的东西:记住,如果你这样做new ClassTwo,你正在制作一个新的activity!这个活动是从classtwo到calssone,它有一个classtwo等。

您可能需要重新定义您的班级结构。找出你想要什么,为什么想要它等等。

【讨论】:

  • 好吧,我有一个带有 5 个按钮的 textView,我想要第二个类来运行 textView 和按钮的所有文本,或者我应该只拥有运行所有文本的代码类,以便 findViewById 工作,这将是最佳实践
  • 如果它是一个辅助类,它不需要扩展你的第一个类。
  • 基本上:不要使用扩展。但是如果你不得不问(我不想在这里变得粗鲁),你可能想要 a) 阅读 OO // 类结构或 b) 在你的第一个类中创建一个成员函数。
  • 我知道有些人可能很粗鲁,我去看看
【解决方案3】:

这是我对您的代码的问题:

  • ClassTwo 扩展 ClassOne [不应该,特别是如果您在 ClassOne 中创建 ClassTwo 的实例]

要从 ClassOne 调用方法,您可以使用“super”关键字。例如,

 class ClassOne{
   public void myMethod() {
      // do stuff
   }
}

class ClassTwo extends ClassOne{
   @Override public void myMethod() {
      super.myMethod(); //call myMethod from ClassOne
      // add more stuff
   }
}

【讨论】:

  • 我只是想知道如何调用另一个类的方法,有人知道吗?
猜你喜欢
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 2011-07-04
  • 1970-01-01
相关资源
最近更新 更多