java - 安卓 : Is it possible to inherit from MainActivity class?

标签 java android inheritance findviewbyid

我一周前开始学习 Java 和 Android 开发,我想了解一些基本知识。

我的应用程序的功能是它有 10 个按钮,每个按钮在单击一次后都会被禁用。如果总共单击了 5 个按钮,则必须禁用所有按钮。 我没有使用按钮数组,但我想知道为什么这不起作用。 (已完成所有必要的进口)

The MainActivity class goes like this:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    StartText();
}

Class1 c1object = new Class1();

TextView textobj;
Button Button1,Button2,Button3,Button4 /* similarly for the other 6 buttons*/ ;

public void StartText(){
    textobj = (TextView)findViewById(R.id.textView);
    textobj.setText("No Button has been clicked");
}

public void Click1(View view)
{
    Button1 = (Button)findViewById(R.id.button1);
    c1object.disablebutton(Button1,textobj,1);

}
public void Click2(View view)
{
    Button2 = (Button)findViewById(R.id.button2);
    c1object.disablebutton(Button2,textobj,2);
}
public void Click3(View view)
{
    Button3 = (Button)findViewById(R.id.button3);
    c1object.disablebutton(Button3,textobj,3);
}

public void Click4(View view)
{
    Button4 = (Button)findViewById(R.id.button4);
    c1object.disablebutton(Button4,textobj,4);

}
// Similarly for 6 more buttons

}

Class1 is this:

public class Class1 {

Class2 c2object = new Class2();

private int Clickcount=0;

public void disablebutton(Button b, TextView t, int i) {
    b.setEnabled(false);
    String str = Integer.toString(i);
    t.setText("You clicked button: " + str);
    Clickcount++;
    if(Clickcount==5)
        c2object.disableAll();
}
}

and finally, Class2 goes like this:

public class Class2 {

MainActivity mainobject = new MainActivity();

public void disableAll(){

    mainobject.Button1.setEnabled(false);
    mainobject.Button2.setEnabled(false);
    mainobject.Button3.setEnabled(false);
    mainobject.Button4.setEnabled(false);
    //Similarly for the other 6 buttons

}

}

如果我运行此命令,我的应用程序将启动,但会显示白屏并且应用程序将关闭。

经过几次尝试,我意识到当我创建 MainActivity 类的对象时总是会发生这种情况。 我什至尝试继承 MainActivity 但结果是一样的。

我还尝试将 Class2 更改为:

public class Class2 {

public void disableAll(){

    Button b1 = (Button)findViewById(R.id.button1);
    b1.setEnabled(false);
//Similarly for the other 9 buttons

}

}

我注意到我不能在这里使用findViewById

这些是我想知道的事情:

  1. 我们可以继承或创建 MainActivity 的对象吗?

  2. 为什么我不能使用除 MainActivity 之外的其他类中的 findViewById

  3. 如何禁用 Clickcount==5 之后的所有按钮?

  4. 您已经了解了我的编码方式。我需要遵循哪些做法?还有其他建议可以让我的编码方式更好吗?

提前感谢您的帮助!

最佳答案

您无法通过其构造函数实例化 Activity 类。因此您将无法编写 MainActivity mainObject = new MainActivity()。但是,即使可能,您仍然不想这样做,因为您将创建 MainActivity 的新实例,而您希望对现有中的按钮进行操作/em> MainActivity.

解决这个问题的一种方法是在您的方法或构造函数中提供您的 MainActivity 作为参数。即

class ClassTwo {

    private MainActivity activity;

    ClassTwo(MainActivity activity) {
        this.activity = activity;
    }

    void disableAll() {
        activity.btn1.setEnabled(false);
        //etc...
    }

}

我个人认为,当您只想对按钮进行操作时,在这里传递 Activity 有点过分了。因此,您可以将按钮作为构造函数参数而不是 Activity 传递:

ClassTwo(Button[] btns) {
    this.btns = btns;
}

或者,您可以传入一个接口(interface)。或者您可以考虑提供 Button 作为方法中的参数,而不是将它们存储在实例变量中(我可能会这样做):

class ClassTwo {

    ClassTwo(){} //Default, empty constructor

    void disableAll(Button[] btns) {
        for (Button btn : btns) {
            btn.setEnabled(false);
        }
    }

}

关于java - 安卓 : Is it possible to inherit from MainActivity class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38306560/

相关文章:

android - 在 Android 中多次调用 onPrimaryClipchanged()

c++ - 从命名空间基类虚拟继承,具有来自命名空间的私有(private)成员

java - 如何在单击时隐藏 ListView?

java - java int 中的整数对于值 08 来说太大了,但是当我只传递 8 或 11,12,13 时就可以了

java - Android Studio 不知道 Java 在哪里

c++ - 什么时候适合使用继承?

c++ - 通过 C++ 中的构造函数将地址参数传递给基类指针

java包 "mylist"不存在

java - 如何达到其他级别深度的 json 值?

android - 我可以为在 Android Play 商店和 Android TV 商店中注册的应用程序使用不同的名称吗?