1

我希望我的應用程序執行的是計算平均值並將其顯示在TextView中。從Button onClick獲取TextView的值,並通過TextWatcher將值傳遞給TextView

我有兩個按鈕(button0和button1)和六個TextViews的佈局。當我按下其中一個按鈕時,我的應用程序將獲得按下的點擊次數以及與另一個按鈕相同的次數。而且它還可以獲得按下兩個按鈕的總點擊次數。因此,如果我按點擊次數來分按鈕0,按下總點擊次數,則按下兩個按鈕,然後將其乘以100,得到按下該按鈕的百分比點擊次數。

所以這是代碼:

Button button0, button1; 
    int click_button0, click_button1; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fragment_fragment1, container, false); 

    final TextView times_0_tv = (TextView) view.findViewById(R.id.times_0); 
    final TextView percentage_0_tv = (TextView) view.findViewById(R.id.percentage_0); 
    final TextView times_1_tv = (TextView) view.findViewById(R.id.times_1); 
    final TextView percentage_1_tv = (TextView) view.findViewById(R.id.percentage_1); 
    final TextView total_clicks_tv = (TextView) view.findViewById(R.id.total_clicks); 

    button0 = (Button) view.findViewById(R.id.button0); 
    button1 = (Button) view.findViewById(R.id.button1); 

    button0.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      click_button0 = click_button0 + 1; 
      total_clicks = click_button0 + click_button1; 
      total_clicks_tv.setText(String.valueOf(total_clicks)); 

      if (click_button0 == 1) { 
       Toast.makeText(getActivity(), "Number 0 has apperared 1 time", Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(getActivity(), "Number 0 has apperared " + click_button0 + " times", Toast.LENGTH_SHORT).show(); 
      } 
      times_0_tv.setText(String.valueOf(click_button0)); 
      times_1_tv.setText(String.valueOf(click_button1)); 

     } 
    }); 

    button1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      click_button1 = click_button1 + 1; 
      total_clicks = click_button0 + click_button1; 
      total_clicks_tv.setText(String.valueOf(total_clicks)); 

      if (click_button1 == 1) { 
       Toast.makeText(getActivity(), "Number 1 has apperared 1 time", Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(getActivity(), "Number 1 has apperared " + click_button1 + " times", Toast.LENGTH_SHORT).show(); 
      } 
      times_0_tv.setText(String.valueOf(click_button0)); 
      times_1_tv.setText(String.valueOf(click_button1)); 

     } 
    }); 

    times_0_tv.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      String times0String = times_0_tv.getText().toString(); 
      String times1String = times_1_tv.getText().toString(); 
      String totaltimesString = total_clicks_tv.getText().toString(); 

      // convert the String into a double 
      if (times0String.length() > 0) { 
       click_button0 = (int) Double.parseDouble(times0String); 
      } 
      if (times1String.length() > 0) { 
       click_button1 = (int) Double.parseDouble(times1String); 
      } 
      if (totaltimesString.length() > 0) { 
       total_clicks = (int) Double.parseDouble(totaltimesString); 
      } 

      // calculate re 
      double percent0calc = calc_percent0(); 

      // set the label for re1Text 
      percentage_0_tv.setText(Double.toString(percent0calc)); 
     } 
    }); 

    times_1_tv.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      String times0String = times_0_tv.getText().toString(); 
      String times1String = times_1_tv.getText().toString(); 
      String totaltimesString = total_clicks_tv.getText().toString(); 

      // convert the String into a double 
      if (times0String.length() > 0) { 
       click_button0 = (int) Double.parseDouble(times0String); 
      } 
      if (times1String.length() > 0) { 
       click_button1 = (int) Double.parseDouble(times1String); 
      } 
      if (totaltimesString.length() > 0) { 
       total_clicks = (int) Double.parseDouble(totaltimesString); 
      } 

      // calculate re 
      double percent1calc = calc_percent1(); 

      // set the label for re1Text 
      percentage_1_tv.setText(Double.toString(percent1calc)); 
     } 
    }); 
} 

double calc_percent0() { 
    return click_button0/total_clicks; 
} 
double calc_percent1() { 
    return click_button1/total_clicks; 
} 

這裏是佈局的截圖:當我按下一個按鈕,這個比例是0%

enter image description here

問題就來了,它不會改變。這個想法是,例如,如果我按下button0 3次,button1 1次,0的百分比是75%,1的百分比是25%。任何想法都會受到歡迎,謝謝!

編輯:我已經刪除了TextWatcher的實現,並且我已經添加了一些代碼行。當我單擊button0時它工作正常,因爲它顯示點擊百分比是100%,但是當我點擊button1時,兩個百分比都變爲0,並且我沒有得到任何百分比。將總點擊的值傳遞給calc的百分比似乎存在問題。

這是現在的代碼爲片段:

Button button0, button1; 
int click_button0, click_button1; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) { 

View view = inflater.inflate(R.layout.fragment_fragment1, container, false); 

final TextView times_0_tv = (TextView) view.findViewById(R.id.times_0); 
    final TextView percentage_0_tv = (TextView) view.findViewById(R.id.percentage_0); 
    final TextView times_1_tv = (TextView) view.findViewById(R.id.times_1); 
    final TextView percentage_1_tv = (TextView) view.findViewById(R.id.percentage_1); 
    final TextView total_clicks_tv = (TextView) view.findViewById(R.id.total_clicks); 

    button0 = (Button) view.findViewById(R.id.button0); 
    button1 = (Button) view.findViewById(R.id.button1); 

    button0.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      click_button0 = click_button0 + 1; 
      total_clicks = click_button0 + click_button1; 
      total_clicks_tv.setText(String.valueOf(total_clicks)); 

      if (click_button0 == 1) { 
       Toast.makeText(getActivity(), "Number 0 has apperared 1 time", Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(getActivity(), "Number 0 has apperared " + click_button0 + " times", Toast.LENGTH_SHORT).show(); 
      } 
      times_0_tv.setText(String.valueOf(click_button0)); 
      times_1_tv.setText(String.valueOf(click_button1)); 
      percent0 = click_button0/total_clicks; 
      percentage_0_tv.setText(String.valueOf(percent0)); 
     } 
    }); 

    button1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      click_button1 = click_button1 + 1; 
      total_clicks = click_button0 + click_button1; 
      total_clicks_tv.setText(String.valueOf(total_clicks)); 

      if (click_button1 == 1) { 
       Toast.makeText(getActivity(), "Number 1 has apperared 1 time", Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(getActivity(), "Number 1 has apperared " + click_button1 + " times", Toast.LENGTH_SHORT).show(); 
      } 
      times_0_tv.setText(String.valueOf(click_button0)); 
      times_1_tv.setText(String.valueOf(click_button1)); 
      percent1 = click_button1/total_clicks; 
      percentage_1_tv.setText(String.valueOf(percent1)); 
     } 
    }); 
} 

回答

1

你爲什麼不只是計算並設置按鈕的onClick的百分比是多少?您想要更新單擊按鈕時的百分比,因此邏輯應位於按鈕OnClickListener內,而不是TextWatcher。

此外,而不是從你的TextViews得到的值,使用已有的變量:int click_button0, click_button1;

使用變量的值是否在onclick的計算,然後設置TextViews值和預期它應該工作。另外,如果你打算嘗試和解析一個字符串作爲數字double,int等,你應該把它包含在try catch中以防異常。在這種情況下,您應該使用Integer.parseInt而不是使用parseDouble,然後將其轉換爲int。

編輯:啊,這是因爲你用int劃分int,所以結果也是int。一個快速解決方案是將其中一個數字轉換爲浮點數/雙精度數,並且當您分割時,您將得到一個十進制數。 ((double) click_button0)/total_clicks;

你也應該同時更新兩個百分比,看看一個數字的變化會影響另一個。

+0

謝謝你的回答,這真的很有用。我已經用你的建議編輯了我的問題,但問題依然存在。希望你有任何想法,謝謝! –

+0

我編輯了我的答案,以幫助您進行修改,希望它有所幫助。 – Dom

+0

非常感謝你,最後我在你的幫助下得到了它! –