Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取对话框';s on click listener从单独的对话类进入我的活动_Java_Android_Oop_Android Studio_Dialog - Fatal编程技术网

Java 获取对话框';s on click listener从单独的对话类进入我的活动

Java 获取对话框';s on click listener从单独的对话类进入我的活动,java,android,oop,android-studio,dialog,Java,Android,Oop,Android Studio,Dialog,我有一个对话课,在那里我保存了我的对话。现在的问题是,我想在活动中重新获得对话框的视图单击侦听器。我知道这可以通过编写接口来实现,但是有没有其他面向对象的方法呢 我的对话类: public class Dialogs{ public void testCompletionDialog() { final Dialog dialog = new Dialog(context); dialog.requestWindowFeature(Window.FEATURE

我有一个对话课,在那里我保存了我的对话。现在的问题是,我想在活动中重新获得对话框的视图单击侦听器。我知道这可以通过编写接口来实现,但是有没有其他面向对象的方法呢

我的对话类:

public class Dialogs{
 public void testCompletionDialog() {

        final Dialog dialog = new Dialog(context);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setCancelable(true);
        dialog.setContentView(R.layout.test_complete_dialog);
        dialog.setTitle("Ratta provet?");



        dialog.findViewById(R.id.lesson_btn_marker).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

//I want my activity to know that this view is clicked.
                 dialog.dismiss();


            }
        });

        dialog.findViewById(R.id.lesson_btn_ratta).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //I want my activity to know that this view is clicked.


            }
        });

        dialog.show();


    }
}
我的活动:

if (areQueOver) {

                    Dialogs dialogs=new Dialogs(TestActivity.this);
                    dialogs.testCompletionDialog();
                }
您可以使用

在对话框类的onClick中发布一个事件,告知对话框已被单击。事件可能包含一个字符串变量,告知单击了哪个对话框

在活动中订阅并处理事件。您可以检查字符串变量值以了解单击了哪个对话框

修改对话框类,如下所示:

public class Dialogs{
 public void testCompletionDialog() {

        final Dialog dialog = new Dialog(context);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setCancelable(true);
        dialog.setContentView(R.layout.test_complete_dialog);
        dialog.setTitle("Ratta provet?");

        dialog.findViewById(R.id.lesson_btn_marker).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 EventBus.getDefault().post("btn_marker");
                 dialog.dismiss();
            }
        });

        dialog.findViewById(R.id.lesson_btn_ratta).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventBus.getDefault().post("btn_ratta");
            }
        });

        dialog.show();
@Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(String action){
        if(action.equals("btn_ratta")){

        } else if(action.equals("btn_marker")) {

        }
    }
活动内部:

public class Dialogs{
 public void testCompletionDialog() {

        final Dialog dialog = new Dialog(context);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setCancelable(true);
        dialog.setContentView(R.layout.test_complete_dialog);
        dialog.setTitle("Ratta provet?");

        dialog.findViewById(R.id.lesson_btn_marker).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 EventBus.getDefault().post("btn_marker");
                 dialog.dismiss();
            }
        });

        dialog.findViewById(R.id.lesson_btn_ratta).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventBus.getDefault().post("btn_ratta");
            }
        });

        dialog.show();
@Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(String action){
        if(action.equals("btn_ratta")){

        } else if(action.equals("btn_marker")) {

        }
    }
在onCreate内部添加此-

EventBus.getDefault().register(this);
EventBus.getDefault().unregister(this);
在onDestroy中添加以下内容-

EventBus.getDefault().register(this);
EventBus.getDefault().unregister(this);
替代方法:

public class Dialogs{
 public void testCompletionDialog() {

        final Dialog dialog = new Dialog(context);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setCancelable(true);
        dialog.setContentView(R.layout.test_complete_dialog);
        dialog.setTitle("Ratta provet?");

        dialog.findViewById(R.id.lesson_btn_marker).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 EventBus.getDefault().post("btn_marker");
                 dialog.dismiss();
            }
        });

        dialog.findViewById(R.id.lesson_btn_ratta).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventBus.getDefault().post("btn_ratta");
            }
        });

        dialog.show();
@Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(String action){
        if(action.equals("btn_ratta")){

        } else if(action.equals("btn_marker")) {

        }
    }
嗯,除了interface和EventBus之外,您可以向活动中添加公共方法,比如

onDialogClicked(String dialogName){//TODO handle the click as per dialogName} 

然后从对话框类中的onClick调用此方法。

是如果要调用任何活动方法,则可以通过活动上下文调用:

假设method1()处于“活动”下,您希望从Dailog调用,然后可以通过调用

 ((MyActivity)((Activity)context)).method1();

将listner用于这样的调用按钮

Simpledialoginterface listner = new Simpledialoginterface() {
    @Override
    public void ok_button() {
        //ok button click
    }

    @Override
    public void cancel_button() {
       //cancel button click
    }
};
使用此对话框

public static void popupnew(String tittle, String message, String Button, String Cancel,
                            final Activity context, final Simpledialoginterface listner) {

    if (!((Activity) context).isFinishing()) {
        android.app.AlertDialog.Builder alertDialog;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            alertDialog = new android.app.AlertDialog.Builder(context, android.R.style.Theme_Material_Light_Dialog_Alert);
        } else {
            alertDialog = new android.app.AlertDialog.Builder(context);
        }
        alertDialog.setTitle(tittle);
        alertDialog.setMessage(message);
        alertDialog.setPositiveButton(Button,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        listner.ok_button();


                    }
                });
        alertDialog.setNegativeButton(Cancel,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        listner.cancel_button();

                    }
                });
        alertDialog.show();
    }

}
//接口类<代码> 公共接口Simpledialoginterface{

public void ok_button();

public void cancel_button();
}

创建一个接口

public interface OnDialogConfirmClickListener {
    void onDialogConfirmClick(Class parameter//or empty);
}
将此接口实现到您的活动中

public class MainActivity extends Activity implements OnDialogConfirmClickListener {
...
}
将接口作为参数发送到对话框或testCompletionDialog方法

public void testCompletionDialog(OnDialogConfirmClickListener listener) {
    ...
    dialog.findViewById(R.id.lesson_btn_marker).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                     listener.onDialogConfirmClick(parameter//or empty);
                     dialog.dismiss();
                }
            });
    ...
    }

我看到这是一个很好的库,但是使用第三方来完成这样一个小任务是不值得的。我可以使用一个接口,而不是使用第三方。我正在android中寻找一些东西,或者至少是一种通用的java方式。是的,不是为了一个小任务,但是如果你正在制作一个应用程序,那么它是非常有用的。我已经编辑了我的答案。请查收。希望如此它现在很有帮助。是的,它实际上是一个非常好的应用程序解决方案,在应用程序中,你可以在类之间进行大量的通信。然而Chetan answer实际上解决了我的问题,但是你的解决方案确实展示了一种新的方式+1非常感谢。我想知道你应该如何使用
界面
。下面我的答案正好是我想要的。在不使方法静态的情况下调用它。真的很感谢。只是想补充一下,你不需要在这里把它放到活动中,因为(MyActivity)已经有助于了解我们指的是什么,上下文本身也可以在这里起作用。对活动进行施法时,会发出重复施法警告。