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

非常感谢你,最后我在你的帮助下得到了它! –

相关问题