android切换按钮状态始终为true

android切换按钮状态始终为true,android,togglebutton,Android,Togglebutton,我一直试图在我的应用程序中使用一个切换按钮作为书签。我第一次用这个。我在onCreateView()下声明了我的切换按钮,如下所示: bmark = (ToggleButton) v.findViewById(R.id.bmark); bmark.setChecked(false); 我正在尝试切换状态,并显示一条Toast消息!我尝试了以下方法: public void onActivityCreated(Bundle savedInstanceState) {

我一直试图在我的应用程序中使用一个
切换按钮
作为书签。我第一次用这个。我在
onCreateView()下声明了我的切换按钮,如下所示:

 bmark = (ToggleButton) v.findViewById(R.id.bmark);
        bmark.setChecked(false);
我正在尝试切换状态,并显示一条
Toast
消息!我尝试了以下方法:

 public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        bmark.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                boolean status;
                if (bmark.isChecked()) status = true;
                else status = false;
                Log.w("Bmark status",String.valueOf(status));
                if (status) {
                    bmark.setChecked(false);
                    Log.w("Bmark after true",String.valueOf(bmark.isChecked()));
                    Toast.makeText(getActivity(), "Bookmark removed!", Toast.LENGTH_SHORT).show();
                } else {
                    bmark.setChecked(true);
                    Log.w("Bmark after false",String.valueOf(bmark.isChecked()));
                    Toast.makeText(getActivity(), "Post Bookmarked..!", Toast.LENGTH_SHORT).show();
                }
            }

        });
每次按下按钮时,状态最初显示为“真”,尽管我已将其设置为“假”。调用
setChecked(false)
后,它也会变为false。但当我再次单击它时,它再次显示为“真”,而不是“假”

我不知道为什么会这样。我只想在每次单击时切换它。请帮帮我!提前感谢:)

将代码更改为:

if (bmark.isChecked()){ 
status = true;
Toast.makeText(getActivity(), "Post Bookmarked..!",Toast.LENGTH_SHORT).show();
}
else {
status = false;
Toast.makeText(getActivity(), "Bookmark removed!", Toast.LENGTH_SHORT).show();
}
切换更改自检状态,您再次这样做,因此状态更改了两次。

将代码更改为:

if (bmark.isChecked()){ 
status = true;
Toast.makeText(getActivity(), "Post Bookmarked..!",Toast.LENGTH_SHORT).show();
}
else {
status = false;
Toast.makeText(getActivity(), "Bookmark removed!", Toast.LENGTH_SHORT).show();
}

切换更改自检状态,您再次这样做,因此状态更改了两次。

问题是您正在通过
onClick()
中的
setChecked()
调用来反转按钮的状态

使用
OnCheckedChangeListener
而不是
OnClickListener
,这样您就不必费心跟踪状态:

bmark.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            // checked
            Toast.makeText(getActivity(), "Post Bookmarked!", Toast.LENGTH_SHORT).show();
        } else {
            // not checked
            Toast.makeText(getActivity(), "Bookmark removed!", Toast.LENGTH_SHORT).show();
        }
    }
});

问题是您正在通过调用
onClick()
中的
setChecked()
来反转按钮的状态

使用
OnCheckedChangeListener
而不是
OnClickListener
,这样您就不必费心跟踪状态:

bmark.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            // checked
            Toast.makeText(getActivity(), "Post Bookmarked!", Toast.LENGTH_SHORT).show();
        } else {
            // not checked
            Toast.makeText(getActivity(), "Bookmark removed!", Toast.LENGTH_SHORT).show();
        }
    }
});

您似乎正在将按钮切换回之前的语句。如果停止在onClickListener中更改按钮的状态,它应该可以正常工作

 private boolean bmarkStatus = false;
 public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    bmark.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
             bmarkStatus = bmark.isChecked();
             if (bmark.isChecked()) Toast.makeText(getActivity(), "Bookmark removed!", Toast.LENGTH_SHORT).show();
             else Toast.makeText(getActivity(), "Bookmark added!", Toast.LENGTH_SHORT).show();
        }

    });
 }

您似乎正在将按钮切换回之前的语句。如果停止在onClickListener中更改按钮的状态,它应该可以正常工作

 private boolean bmarkStatus = false;
 public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    bmark.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
             bmarkStatus = bmark.isChecked();
             if (bmark.isChecked()) Toast.makeText(getActivity(), "Bookmark removed!", Toast.LENGTH_SHORT).show();
             else Toast.makeText(getActivity(), "Bookmark added!", Toast.LENGTH_SHORT).show();
        }

    });
 }

仅供参考,接受的答案不是最佳解决方案,因为它需要处理一个布尔标志来跟踪状态。答案中的状态是附加的,因为它在原始代码中,可能在不同的位置使用,所以没有什么可优化的。@MaciejSikora如果它是
onClick()中的局部变量,它在不同的位置如何使用
?您的评论没有任何意义。仅供参考,接受的答案不是最佳解决方案,因为它需要处理一个布尔标志来跟踪状态。答案中的状态是附加的,因为它在原始代码中,可能在不同的位置使用,因此,没有什么可优化的。@MaciejSikora如果它是
onClick()
中的一个局部变量,它在不同的地方是如何使用的?你的评论没有任何意义。