2014-11-05 96 views
0

我有3个切换按钮。一次只允许一个打开。任何人都可以告诉我为什么其他两个切换按钮不会关闭,如果第三个按钮被按下。当其他的Togglebutton被点击时Togglebutton不会关闭

MusicPlayerActivity.java

package com.example.musicplayer; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ToggleButton; 

public class MusicPlayerActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.music_player); 
     addListenerOnButton(null); 
    } 

    public void addListenerOnButton(View view) { 
     ToggleButton artist = (ToggleButton) findViewById(R.id.artistID); 
     ToggleButton album = (ToggleButton) findViewById(R.id.albumID); 
     ToggleButton song = (ToggleButton) findViewById(R.id.songID); 

    } 
} 

music_player.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="${relativePackage}.${activityClass}" > 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="18dp" 
     android:background="#009ACD" 
     android:text="Play All Music" 
     android:textColor="#FFFFFF" /> 

<RadioGroup 
    android:id="@+id/toggleGroup" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 

    <ToggleButton 
     android:id="@+id/albumID" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:onClick="addListenerOnButton" 
     android:layout_alignBottom="@+id/artistID" 
     android:layout_toRightOf="@+id/artistID" 
     android:text="Album" 
     android:textOff="Album" 
     android:textOn="Album" /> 

    <ToggleButton 
     android:id="@+id/songID" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBaseline="@+id/albumID" 
     android:onClick="addListenerOnButton" 
     android:layout_alignBottom="@+id/albumID" 
     android:layout_toRightOf="@+id/albumID" 
     android:text="Song" 
     android:textOff="Song" 
     android:textOn="Song" /> 

    <ToggleButton 
     android:id="@+id/artistID" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:onClick="addListenerOnButton" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/button1" 
     android:layout_marginLeft="63dp" 
     android:layout_marginTop="16dp" 
     android:text="Artist" 
     android:textOff="Artist" 
     android:textOn="Artist" /> 
</RadioGroup> 
</RelativeLayout> 
+0

如果下面的答案之一帮助你,请选择一个“接受的答案”。如果没有,请让我们知道您遇到的问题 – 2014-11-13 15:58:12

回答

1

问题是切换器isChecked按钮的方法是不被解雇。

OPTION 1

在XML文件中,添加这一行的每个切换按钮的

android:onClick="MethodName" 

<ToggleButton 
     android:id="@+id/albumID" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/artistID" 
     android:layout_toRightOf="@+id/artistID" 
     android:text="Album" 
     android:textOff="Album" 
     android:textOn="Album" 
     android:onClick="onAlbumIDClicked" /> 

在你onCreate方法,创建相应的方法和然后检查他们是否被检查。这将工作。

OPTION 2

删除所有的if语句,并添加以下

 artist.setOnCheckedChangeListener(changeChecker); 
     album.setOnCheckedChangeListener(changeChecker); 
     song.setOnCheckedChangeListener(changeChecker); 

     OnCheckedChangeListener changeChecker = new OnCheckedChangeListener() { 

    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     if (isChecked){ 
      if (buttonView == artist) { 
       artist.setChecked(true); 
       album.setChecked(false); 
       song.setChecked(false); 
      } 
      if (buttonView == album) { 
       artist.setChecked(false); 
       album.setChecked(true); 
       song.setChecked(false); 
      } 
      if (buttonView == song) { 
       artist.setChecked(false); 
       album.setChecked(false); 
       song.setChecked(true); 
      } 
     } 
    } 
}; 

OPTION 3这个代码 - 在XML文件中使用无线电集团

,添加以下行的代码包装了3个切换按钮。

<RadioGroup android:id="@+id/toggleGroup" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="24dp" 
       android:orientation="horizontal" 
      > 

在你的活动类,创建一个侦听

static final RadioGroup.OnCheckedChangeListener ToggleListener = new RadioGroup.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(final RadioGroup radioGroup, final int i) { 
      for (int j = 0; j < radioGroup.getChildCount(); j++) { 
       final ToggleButton view = (ToggleButton) radioGroup.getChildAt(j); 
       view.setChecked(view.getId() == i); 
      } 
     } 
    }; 

现在,在onCreate方法注册监听器。

((RadioGroup) findViewById(R.id.toggleGroup)).setOnCheckedChangeListener(ToggleListener); 

现在在onToggle方法中,根据id,进行相应设置。

public void onToggle(View view) { 
    ((RadioGroup)view.getParent()).check(view.getId()); 
    // app specific stuff .. 
} 
+0

@VinceEmigh,同意。有更好的方法来处理这个问题。但是我为他在代码中面临的问题提供了解决方案。 – Prem 2014-11-05 20:57:33

+0

我更新了我的代码。我添加了一个onclick =方法的名字,但它给了我一个nosuchmethodexception。为什么没有看到我的方法“addListenerOnButton”? – 2014-11-05 21:07:18

+0

@VinceEmigh,在我的回答中添加了RadioGroup的详细信息:) – Prem 2014-11-05 21:30:45

0

而应该使用一个RadioGroup项目已被选定后,管理去选择任何其他选定的项目。它被称为“多重排除”,它确保一次只选择一个项目。

<RadioGroup 
    android:id="@+id/toggleGroup" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 

    <ToggleButton 
     android:id="@+id/albumID" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:onClick="addListenerOnButton" 
     android:layout_alignBottom="@+id/artistID" 
     android:layout_toRightOf="@+id/artistID" 
     android:text="Album" 
     android:textOff="Album" 
     android:textOn="Album" /> 

    <ToggleButton 
     android:id="@+id/songID" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBaseline="@+id/albumID" 
     android:onClick="addListenerOnButton" 
     android:layout_alignBottom="@+id/albumID" 
     android:layout_toRightOf="@+id/albumID" 
     android:text="Song" 
     android:textOff="Song" 
     android:textOn="Song" /> 

    <ToggleButton 
     android:id="@+id/artistID" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:onClick="addListenerOnButton" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/button1" 
     android:layout_marginLeft="63dp" 
     android:layout_marginTop="16dp" 
     android:text="Artist" 
     android:textOff="Artist" 
     android:textOn="Artist" /> 
</RadioGroup> 

此组将确保一次只选择1个ToggleButton。 现在,如果您想为此添加侦听器,则必须指定onClick属性。对于该值,您可以指定要执行的方法。

的方法必须

  • 是公共
  • 返回void
  • 定义视图作为其唯一的参数(这将是为点击查看)

这个问题你addListenerOnButton方法是它不声明View参数。你的方法应该看起来像

public void addListenerOnButton(View view) { 

} 

而且,由于你有RadioGroup,你不再需要手动取消选择其他按钮。

+0

我删除了手动取消选择并更新了我的代码。但现在的问题是,如果我点击一个按钮,然后点击另一个按钮,它们都会亮起。我必须再次点击按钮来关闭按钮,这是我不想要的? – 2014-11-05 22:50:17

+0

@gmanplex Android的'RadioGroup'与ButtonGroup非常相似(如果你曾经使用它的话)。如果两个按钮位于同一组中,则不能同时选择它们。现在,您正在手动处理取消选择,因为您没有系统可以为您进行管理。这就是'RadioGroup'的用途。它确保一次只能选择组中的1个按钮 – 2014-11-05 22:53:06