Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从按钮onClick获取TextView的值,并通过TextWatcher将值传递给TextView_Android_Android Fragments_Textview_Android Button_Textwatcher - Fatal编程技术网

Android 从按钮onClick获取TextView的值,并通过TextWatcher将值传递给TextView

Android 从按钮onClick获取TextView的值,并通过TextWatcher将值传递给TextView,android,android-fragments,textview,android-button,textwatcher,Android,Android Fragments,Textview,Android Button,Textwatcher,我想让我的应用程序做的是计算平均值并在文本视图中显示它 我有一个包含两个按钮(按钮0和按钮1)和六个文本视图的布局。当我按下其中一个按钮时,我的应用程序会得到它被按下的点击次数,而另一个按钮也是如此。它还可以获得按下两个按钮的总点击次数。因此,如果我将点击次数除以按钮0被按下的次数,再乘以两个按钮被按下的总点击次数,我得到按钮被按下的点击百分比 这就是代码: Button button0, button1; int click_button0, click_button1;

我想让我的应用程序做的是计算平均值并在文本视图中显示它

我有一个包含两个按钮(按钮0和按钮1)和六个文本视图的布局。当我按下其中一个按钮时,我的应用程序会得到它被按下的点击次数,而另一个按钮也是如此。它还可以获得按下两个按钮的总点击次数。因此,如果我将点击次数除以按钮0被按下的次数,再乘以两个按钮被按下的总点击次数,我得到按钮被按下的点击百分比

这就是代码:

    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%,它没有改变。例如,如果我按按钮0 3次,按按钮1 1 1次,0的百分比是75%,1的百分比是25%。欢迎任何意见,谢谢

编辑:我删除了TextWatcher的实现,并在代码中添加了一些行。当我点击button0时效果很好,因为它显示点击的百分比是100%,但当我点击button1时,两个百分比都变为0,我没有得到任何百分比。将总点击量的值传递给百分比计算时似乎出现了问题

下面是片段的代码:

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

为什么不在点击按钮时计算并设置百分比呢?您希望在单击按钮时更新百分比,因此逻辑应该在按钮OnClickListener中,而不是TextWatcher中

另外,不要从文本视图中获取值,而是使用已有的变量:
int click\u button0,click\u button1

使用变量值在onClick中进行计算,然后设置TextViews值,它应该按照预期工作

此外,如果您要尝试将字符串解析为数字double、int等,则应在出现异常时将其包围在try catch中。在这种情况下,您应该只使用Integer.parseInt,而不是使用parseDouble,然后将其强制转换为int

编辑:啊,是的,这是因为你将一个整数除以一个整数,因此结果也将是一个整数。一个快速解决方法是将其中一个数字转换为浮点/双精度,当你除以时,你将得到一个十进制数。
((双击)按钮0)/总点击次数


您还应该同时更新这两个百分比,因为一个数字的变化会影响另一个。

谢谢您的回答,这非常有用。我已经用你的建议编辑了我的问题,但问题仍然存在。希望你有任何想法,谢谢!我编辑了我的答案,希望能对你的编辑有所帮助。非常感谢你,终于在你的帮助下得到了答案!