Android ImageButton赢了';t改变';背景';按下并释放时

Android ImageButton赢了';t改变';背景';按下并释放时,android,android-studio,Android,Android Studio,我正在制作一个有按钮的应用程序,当点击按钮时,它会播放声音。我的问题是,当按下并释放mSoundButton时,我找不到改变其背景的方法。我使用的是“背景”而不是“src”,这样我就可以缩小按钮而不必从边缘切割。我还没有添加声音,因为我想在开始添加声音之前解决这个问题 这是我在MainActivity.java中的按钮代码(它工作正常,但不是我想要的方式。按下时会更改背景,但不会释放) 这是我的activity_main.xml <?xml version="1.0" encoding="

我正在制作一个有按钮的应用程序,当点击按钮时,它会播放声音。我的问题是,当按下并释放mSoundButton时,我找不到改变其背景的方法。我使用的是“背景”而不是“src”,这样我就可以缩小按钮而不必从边缘切割。我还没有添加声音,因为我想在开始添加声音之前解决这个问题

这是我在MainActivity.java中的按钮代码(它工作正常,但不是我想要的方式。按下时会更改背景,但不会释放)

这是我的activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/soundButton"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:background="@drawable/button_not_clicked"
        android:contentDescription="TODO" />

</LinearLayout>
单击mSoundBtn时,它会更改图像并等待1000毫秒(1秒),然后更改回上一个图像,当按下该图像时,它会创建某种动画,以便用户可以理解按下按钮的时间


感谢所有试图提供帮助的人,感谢阅读。:)

您不应该将其定义为“最终的”
样本:


如果我理解正确,您希望在用户从按钮上取下手指后执行操作(意味着按下完成)。 尝试使用OnTouchListener而不是OnClickListener:

imageButton.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) 
    {
        if(event.getAction() == MotionEvent.ACTION_UP)
        {
            // change background and other stuff...
            return true;
        }
        return false;
    }
});
如果只想在按下按钮时更改按钮的背景,可以使用可绘制的选择器,如下所示:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
    android:drawable="@color/black" /> <!-- pressed -->
<item android:state_activated="true"
    android:drawable="@color/colorAccent" /> <!-- focused -->
<item android:drawable="@color/colorPrimary" /> <!-- default -->

然后把它作为按钮的背景


另一个选项是使用切换按钮和OnChecked侦听器,并在用户检查(按下)按钮时更改背景。如果您希望在第一次切换后永久更改背景,可以通过仅在第一次切换后更改背景来实现此目的。

我不能从public开始。上面写着“非法开始表达”。当我删除public时,我无法从内部类访问变量,它会告诉我添加final。很抱歉回答得太晚。您的代码已经解决了从内部类访问的问题,但需要单击两次按钮才能访问它的第一个映像。我希望它在发布之初就变成它的图像。我不知道怎么做。是的,这就是我想要按钮基本上做的,但我也需要按钮被按下时做的。我现在正在试。它可能会解决这个问题。兄弟,我建议你使用下面的背景状态列表,比如@geekybean。它更简单更干净。
    public class SampleActivity extends AppCompatActivity {

    //Variables
    public ImageButton mSoundBtn;
    public boolean isSoundBtnSelected = false; 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sample);

        mSoundBtn = findViewById(R.id.soundButton);
        mSoundBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if(!isSoundBtnSelected)
                    mSoundBtn.setBackgroundResource(R.drawable.button_clicked);
                else
                    mSoundBtn.setBackgroundResource(R.drawable.button_not_clicked);

                isSoundBtnSelected = !isSoundBtnSelected;
            }
        });
      }

    }
imageButton.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) 
    {
        if(event.getAction() == MotionEvent.ACTION_UP)
        {
            // change background and other stuff...
            return true;
        }
        return false;
    }
});
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
    android:drawable="@color/black" /> <!-- pressed -->
<item android:state_activated="true"
    android:drawable="@color/colorAccent" /> <!-- focused -->
<item android:drawable="@color/colorPrimary" /> <!-- default -->