【问题标题】:How can I access to a button inside a customized AlertDialog?如何访问自定义 AlertDialog 中的按钮?
【发布时间】:2017-06-04 11:57:49
【问题描述】:

我是 Android 编程的新手,所以我希望这个问题对你们来说很容易。

我正在打开一个自定义AlertDialog,带有一个额外的按钮和一个seekbar,以显示播放歌曲的进度。我的问题是我无法访问该按钮的onClick 方法。

我正在使用以下代码打开 AlertDialog:

public void openAudioPlayer(View view){

    new AlertDialog.Builder(this)
            .setTitle(R.string.audio_player_title)
            .setMessage(R.string.audio_player_description)
            .setView(R.layout.dialog_audio_player)
            .setPositiveButton(R.string.confirm,null)
            .setNegativeButton(R.string.cancel, null).show();

}

dialog_audio_player 是自定义 XLM 文件:

<?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:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/playerBox"
        android:layout_centerVertical="true">

        <ToggleButton
            android:id="@+id/playStateButton"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_centerVertical="true"
            android:background="@drawable/toggle_player"
            android:onClick="onPlayerClicked"
            android:checked="false"
            android:focusable="false"
            android:focusableInTouchMode="false"
            android:textOff=""
            android:textOn="" />

        <SeekBar
            android:id="@+id/seekBar"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_toRightOf="@id/playStateButton" />
        </RelativeLayout>
</LinearLayout>

所以,我想用我自定义的onPlayerCLicked 方法控制该按钮的按下,该方法包含在与openAudioPlayer 相同的活动中:

public void onPlayerClicked(View view){
    Toast.makeText(this,"clicked",Toast.LENGTH_LONG).show();
}

但是程序从不进入那里。事实上,应用程序关闭。

我该怎么做?

崩溃如下:

06-04 12:47:13.587 3928-3928/vmc.songbook E/AndroidRuntime: FATAL EXCEPTION: main
                                                        Process: vmc.songbook, PID: 3928
                                                        java.lang.IllegalStateException: Could not execute method for android:onClick
                                                            at android.view.View$DeclaredOnClickListener.onClick(View.java:4698)
                                                            at android.view.View.performClick(View.java:5610)
                                                            at android.widget.CompoundButton.performClick(CompoundButton.java:122)
                                                            at android.view.View$PerformClick.run(View.java:22265)
                                                            at android.os.Handler.handleCallback(Handler.java:751)
                                                            at android.os.Handler.dispatchMessage(Handler.java:95)
                                                            at android.os.Looper.loop(Looper.java:154)
                                                            at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                            at java.lang.reflect.Method.invoke(Native Method)
                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
                                                         Caused by: java.lang.reflect.InvocationTargetException
                                                            at java.lang.reflect.Method.invoke(Native Method)
                                                            at android.view.View$DeclaredOnClickListener.onClick(View.java:4693)
                                                            at android.view.View.performClick(View.java:5610) 
                                                            at android.widget.CompoundButton.performClick(CompoundButton.java:122) 
                                                            at android.view.View$PerformClick.run(View.java:22265) 
                                                            at android.os.Handler.handleCallback(Handler.java:751) 
                                                            at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                            at android.os.Looper.loop(Looper.java:154) 
                                                            at android.app.ActivityThread.main(ActivityThread.java:6077) 
                                                            at java.lang.reflect.Method.invoke(Native Method) 
                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
                                                         Caused by: java.lang.RuntimeException: stop failed.
                                                            at android.media.MediaRecorder.stop(Native Method)
                                                            at vmc.songbook.RecordAudio.stopRecording(RecordAudio.java:121)
                                                            at vmc.songbook.RecordAudio.onToggleClicked(RecordAudio.java:84)
                                                            at java.lang.reflect.Method.invoke(Native Method) 
                                                            at android.view.View$DeclaredOnClickListener.onClick(View.java:4693) 
                                                            at android.view.View.performClick(View.java:5610) 
                                                            at android.widget.CompoundButton.performClick(CompoundButton.java:122) 
                                                            at android.view.View$PerformClick.run(View.java:22265) 
                                                            at android.os.Handler.handleCallback(Handler.java:751) 
                                                            at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                            at android.os.Looper.loop(Looper.java:154) 
                                                            at android.app.ActivityThread.main(ActivityThread.java:6077) 
                                                            at java.lang.reflect.Method.invoke(Native Method) 
                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

【问题讨论】:

    标签: android button onclick dialog android-alertdialog


    【解决方案1】:

    更新你的方法openAudioPlayer()如下:

    public void openAudioPlayer(View view){
    
        LayoutInflater layoutInflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
        // Custom dialog layout
        View dialogView = layoutInflater.inflate(R.layout.dialog_audio_player, null);
    
        // PLAY/PAUSE button
        ToggleButton playStateButton = (ToggleButton) dialogView.findViewById(R.id.playStateButton);
        playStateButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // DO something...
            }
        });
    
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(R.string.audio_player_title)
               .setMessage(R.string.audio_player_description)
               .setView(dialogView)
               .setPositiveButton(R.string.confirm, null)
               .setNegativeButton(R.string.cancel, null);
    
        // Create dialog 
        AlertDialog alertDialog = builder.create();
    
        // Show dialog
        alertDialog.show();
    }
    

    【讨论】:

    • 很高兴知道这一点。 :)
    【解决方案2】:
    LayoutInflater layoutInflater = LayoutInflater.from(this);
    View view = layoutInflater.inflate(R.layout.dialog_audio_player , null);
    final AlertDialog alertD = new AlertDialog.Builder(this).create();
    ToggleButton btn = (ToggleButton) view.findViewById(R.id.playStateButton);
    
    btn.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
    
        // btn has been clicked
    
      }
    }); 
    
     alertD.setView(view);
     alertD.show();
    

    【讨论】:

    • 首先,您没有在调用 show() 之前调用 create(),这就是它崩溃的原因。要使用自定义视图布局,请参阅developer.android.com/guide/topics/ui/dialogs.html
    • 感谢您的回答,但我不是在问如何自定义正负按钮,而是在 XLM 文件中多一个...
    • @VictorMartinez 在应用停止工作时发布您的崩溃日志。
    • @VictorMartinez 你是如何将你的按钮与 xml 中的 ID 连接起来的?
    • 我没有。我不知道按下该按钮时如何触发动作 (android:onClick="onPlayerClicked")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2011-10-11
    • 2015-06-25
    • 1970-01-01
    • 2016-09-26
    相关资源
    最近更新 更多