2016-07-11 1 views
0

ちょうど1週間前にJavaとAndroid Developmentを学習し始めました。私は知りたい基本的なことをいくつか持っています。アンドロイド:MainActivityクラスから継承できますか?

私のアプリケーションの機能は、10個のボタンがあり、それぞれが1回クリックされると無効になることです。合計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. MainActivity以外の別のクラスのfindViewByIdを使用できないのはなぜですか?

  3. Clickcount==5の後にすべてのボタンを無効にするにはどうすればよいですか?

  4. あなたは私のコーディング方法を見てきました。私が従う必要があるプラクティスはどれですか?私のコーディング方法を改善するための他の提案はありますか?

ありがとうございました!

+0

を、どこif文を持っていますif(Clickcount == 5){myButton.setEnabled(false); }あなたが必要とする多くのボタンのためにそれを行います。また、MainActivityクラスのインスタンスを作成することについてコードを構造化することはお勧めしません。オブジェクトのインスタンスを作成する必要がある場合は、そのために別のクラスを作成します。私はfindViewByIdの部分についてはよく分かりません。 – Michael

+0

それは私がやったこととほとんど同じです。問題は、MainActivityのオブジェクトを作成せずにこのクラスからmyButtonにアクセスできないことです。しかし、そうすることは、私のアプリケーションをクラッシュさせることです。 –

+0

MainActivityを静的にして、すべての無効化ボタンのコードをMainActivityの静的メソッドに入れることができます。ちょうどインスタンス化する必要はありません。クラッシュしたときにどんなエラーが出ますか? – Michael

答えて

1

コンストラクタ経由でActivityクラスをインスタンス化します。だから、MainActivity mainObject = new MainActivity()と書くことはできません。しかし、たとえ可能であれば、MainActivityという新しいインスタンスを作成するのに対し、のボタンに対して操作を実行したい場合は、MainActivityのボタンを操作したい場合は、これを実行することはできません。

これを回避する方法の1つは、あなたのメソッドまたはコンストラクタではなく、あなたのMainActivityを引数として与えることです。私。私はあなたがしたいすべてのボタンに作用しているとき、ここでActivityに渡すと、やりすぎだと思いますけれども個人的に

class ClassTwo { 

    private MainActivity activity; 

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

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

} 

。あなたはinterfaceに渡すことができ、

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

をまたは:だから、あなたの代わりに活動のコンストラクタ引数としてボタンを渡すことができますどちらか。それとも、ただ(私はおそらくこのために行くだろう)ではなく、インスタンス変数に格納するよりも、この方法では、引数としてButton Sを供給考えることができます:ボタンを無効にするため

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

あなたはクラス2のこのようなオブジェクトを作成することができます追加:あなたはクラス2のボタンを見つけたいときMainActivityののonCreateで、その後

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

Class2 class2=new Class2(MainActivity.this); 

、あなたは

を使用することができます
mainobject.getCurrentView().findviewByID() 
関連する問題