2016-07-11 5 views
0

Я начал изучать Java и Android Development всего неделю назад, и у меня есть пара основных вещей, которые я хотел бы знать.android: Можно ли наследовать класс MainActivity?

Функционирование моего приложения состоит в том, что у него есть 10 кнопок, и каждый из них отключен после того, как он был нажат один раз. Если нажата всего 5 кнопок, все кнопки должны быть отключены. Я не использовал массив кнопок, но я хочу знать, почему это не работает. (все необходимые импорта были сделаны)

MainActivity класс выглядит следующим образом:

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 это:

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

и, наконец, Class2 выглядит следующим образом:

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. Почему я не могу использовать findViewById из другого класса, кроме MainActivity?

  3. Что делать, чтобы отключить все кнопки после Clickcount==5?

  4. Вы видели мой способ кодирования. Любые методы, которым я должен следовать? Любые другие предложения, чтобы лучше сделать мой способ кодирования?

Благодарим за помощь!

+0

Для отключения кнопки есть, если заявление, где if (Clickcount == 5) {myButton.setEnabled (false); } и сделайте это на столько кнопок, сколько вам нужно. Также я бы не рекомендовал структурировать ваш код вокруг создания экземпляров класса MainActivity. Если вам нужно создать экземпляры объекта, создайте для этого еще один класс. Однако я не уверен в части findViewById. – Michael

+0

Это в значительной степени то, что я сделал. Проблема в том, что я не могу получить доступ к myButton из этого класса, не создавая объект MainActivity. Но делать это приводит к сбою моего приложения. –

+0

Вы можете попробовать сделать MainActivity static и поместить весь код кнопки отключения в статическом методе в MainActivity. Просто вам не нужно создавать экземпляр. Какие ошибки вы получаете, когда он падает? – Michael

ответ

1

Вы не можете создайте класс Activity через его конструктор. Таким образом, вы не сможете написать MainActivity mainObject = new MainActivity(). Вы все равно не хотели бы этого делать, даже если бы это было возможно, так как вы бы создали новый экземпляр MainActivity, тогда как вы хотите провести операции с кнопками в существующихMainActivity.

В одном случае это будет поставлять ваш MainActivity в качестве аргумента i ни ваш метод, ни конструктор. То есть

class ClassTwo { 

    private MainActivity activity; 

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

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

} 

Лично хотя я думаю, проходя в 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); 
     } 
    } 

} 
0

Вы должны инициализировать кнопки с помощью (findViewByID (R.id.кнопка) и добавить

setOnClickListener(new OnClickListener(){ 
@Override 
public void onClick(View v){ // action} 
}); 
0

вы можете создать Class2 объект вроде этого:

public Class2(MainActivity mainactivity){ 
    this.mainobject =mainactivity; 
} 

то в OnCreate MainActivity в

Class2 class2=new Class2(MainActivity.this); 

, когда вы хотите найти кнопки в Class2, вы можете использовать

mainobject.getCurrentView().findviewByID() 
Смежные вопросы