2016-07-22 2 views
1

Пробовал использовать ToggleButton, чтобы действовать как элемент закладки в моем приложении. Я использую это в первый раз. Я объявил мою кнопку переключения под onCreateView(), как показано ниже:android toggle button state always true

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), он также становится ложным. Но когда я снова нажимаю на него, он снова читает «true», а вместо «false»

Я не знаю, почему это происходит так. Я просто хочу переключать его каждый раз, когда я нажимаю на него. Pls помогите мне! Заранее спасибо :)

+0

FYI принятый ответ не является оптимальным решением, так как он требует обработки булевского флага для отслеживания состояния. – earthw0rmjim

+0

статус в ответе является дополнительным, потому что он был в оригинальном коде, может быть, он используется в другом месте, поэтому не имеет ничего оптимального или нет. –

+0

@MaciejSikora Как он используется в другом месте, если это локальная переменная в 'onClick()'? Ни один из ваших комментариев не имеет никакого смысла. – earthw0rmjim

ответ

2

Изменить код:

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

Переключение изменяет сам проверяются состояние, вы сделали это снова, чтобы статус был изменен в два раза.

2

Проблема заключается в том, что вы инвертируете состояние своей кнопки по звонкам setChecked() в onClick().

Используйте 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(); 
     } 
    } 
}); 
1

Вы, кажется, переключая кнопки назад к тому, что это было ранее в ваши заявления. Если вы перестанете изменять состояние кнопки в 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(); 
     } 

    }); 
}