2017-10-17 3 views
-1

まず、私は英語では良くなく、Androidプログラミングにとっては全く新しいと言わなければなりません。if else文をフラグメント化したボタン、FuzFragmentを設定する

サーバーのパフォーマンスを監視できるアプリを作成したいと考えています。私は自分のアプリケーションのインターフェイスとしてナビゲーションドロワーを使用しています。それぞれには、さまざまなアクティビティーを実行している断片がいくつかあります。断片の1つ、結果を送信するためにボタンを使用してelse文の計算を使用してサーバのパフォーマンスを計算できるアクティビティを作成したいと思います。私のアプリケーションを実行すると、私はこのアプリケーション(FuzFragment)に問題があります。私のアプリはすぐに「残念ながらServerMonitorAppが停止しました」というエラーで停止しました。

以下

は、私がレイアウトを表示するために使用されるフラグメントのクラス(FuzFragment)です:

package com.example.servermonitorapp; 

    import android.os.Bundle; 
    import android.support.v4.app.Fragment; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.Button; 
    import android.widget.EditText; 
    import android.widget.LinearLayout; 
    import android.widget.TextView; 

    public class FuzFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     if (container == null) { 
      return null; 
     } 

     LinearLayout mLinearLayout = (LinearLayout) inflater.inflate(R.layout.fragment_fuz, 
       container, false); 

     Button sumButton = (Button) mLinearLayout.findViewById(R.id.submitButton); 
     sumButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       EditText cpu = (EditText) v.findViewById(R.id.textCPU); 
       EditText ram = (EditText) v.findViewById(R.id.textRAM); 
       TextView res = (TextView) v.findViewById(R.id.txtResult); 

       int cpuslow = Integer.parseInt(cpu.getText().toString()); 
       int cpusmedium = Integer.parseInt(cpu.getText().toString()); 
       int cpushigh = Integer.parseInt(cpu.getText().toString()); 
       int ramlow = Integer.parseInt(ram.getText().toString()); 
       int rammedium = Integer.parseInt(ram.getText().toString()); 
       int ramhigh = Integer.parseInt(ram.getText().toString()); 

       if (cpuslow > 0 && cpuslow <= 30 | ramlow > 0 && ramlow <= 23) { 
        res.setText("Safe"); 

       } else if (cpusmedium > 30 && cpusmedium <= 60 | rammedium > 23 && rammedium <= 38) { 
        res.setText("Risk"); 

       } else if (cpushigh > 60 | ramhigh > 38) { 
        res.setText("Very Risk"); 

       } else { 
        res.setText("Invalid Number"); 
       } 

      } 
     }); 
     return mLinearLayout; 
    } 
    } 

は私のアプリが応答を停止した原因となることができる私のコードを持つ間違っはありますか?私はまだAndroidプログラミングで学んでいるので、これについて多くの助けが必要です。

答えて

0

Androidの開発の暗い側面へようこそ;)。 これで、基本的なことを説明します。

onCreateメソッドは、レイアウトを拡大または描画するために使用されます。レイアウトを描画する前に(findViewByIdを実行した場合)、それは存在しません。

onCreateメソッドで画像を描画するには、デフォルトで作成されたsetContentメソッドが必要です。これは、あなたが呼び出すコードの最初の行でない場合、その1つでなければなりません。それは、ACTIVITYのUI関連の相互作用のために、その行の後にすべてが利用可能であることを保証します。あなたが断片になったときに規則が変わるので、活動を重視します。

今、次の問題はコードが膨れていることです。好きなことをする。

EditText myText = findViewById(R.id.myText); 
int myValue = Integer.parseInt(myText.getText.toString()); 

など。すべてが同じラインで行うことができ、あなたはそうちょうどそれが好きですかどこか他のMYTEXTへの参照を使用していない。

int myValue = Integer.parseInt(findViewById(R.id.myText).getText.toString()); 

を私は擬似コードをやっているに注意してください。 「あなたのコードに誤りがあります」と返信する人ではないか、笑いません。

次は、onCreateでsetContentViewメソッドを実行したことがないと思われますので、それを置き、コンテンツをinflateしているレイアウトに一致するactivity.xmlコードに設定してください。

次に、ボタンクリック内でfindViewByIdを実行しています。これは不必要なリピートコードです。 textViewを繰り返し使用する必要がある場合は、繰り返し参照を避けるために、textViewへの参照を格納してください。

class MyClass{ 

EditText myTextBox; 

protected void onCreate(stuff){ 
    myTextBox = findViewById(R,id.myTextBox); 

    findViewById(R.id.myButton).setOnClickListener(new OnClickListener()){ 
      @Override 
      protected void onClick(){ 
       int myValue = Integer.parseInt(myTextBox.getText().toString()); 
      } 

    }); 
} 

また、記録のためには、onCreateは非常にきれいであるべきです。私は通常、データバインドの日の前に、私のfindViewById呼び出しを行うsyncUIメソッドを持っています。私はもうそれをやりませんが、学ぶ新しい人は大丈夫です。

私のsyncUIでは、onCreateでネストするのではなく、クリックリスンを処理するラッパーメソッドを呼び出しますが、今は学習中です。しかし、あなたが簡単な例をしたい場合..

onCreate(){ 
    setContentView(myViewPointer from the R File); 
    syncUI(); 

} 

private void syncUI(){ 
    //SETUP TEXTVIEWS OR OTHER UIs that you need 
    //get btnSubmit reference from findViewByid 

    btnSubmit_onClick(); //called one time in onCreate to wrap the click listener into method that allows it to collapse and be easily found. 
} 

private btnSubmit_onClick(){ 
    btnSubmit.setOnClickListener(new OnClickListener(){ 
     @Override 
     protected void onClick(){ 
       //handle Clicks 
     } 

    }); 
} 
0

あなたの返信のためのサム

私のアプリの実行時に私のフラグメントが応答しなくなる原因を突き止めたのは、myfragment.xmlファイルの実際のレイアウトが上記のコードでLinearLayoutとして宣言したと誤っている可能性があります。 Relativelayout(下記参照)。

LinearLayout mLinearLayout = (LinearLayout) inflater.inflate(R.layout.fragment_fuz, 
 
       container, false);

私はそれを修正した後、私のアプリを開くことができるとことができ、上記の関連フラグメントが開きます。少数のサンプルを使用してコードを実行しようとすると問題が発生するだけで、私のアプリは同じエラーで応答を停止する "残念ながら、ServerMonitorAppが停止しました"。