Android 从非 Activity 类 调用的对话框中创建和返回值
Android creating and returning value from dialogs called from non-Activity classes
我构建了一个 Android 应用程序,它从六个不同的活动中调用与 TCP 套接字相关的线程。它工作得很好,但是当我尝试添加一个简单的对话框时 在启动线程之前询问用户的 id/pw (线程中需要检索到的数据),我遇到了麻烦.有一个适配器class,它实际上被调用来启动线程,但它也不是一个可以实现对话的"Activity"。
有什么更聪明的方法可以解决这个问题吗?添加六个相同的代码来创建对话框,并为每个对话框实现额外的六个相同的处理程序将解决这个问题,但我认为这不是正确的做法。
我试图将对话框设为 Activity(带有对话框主题),但它不能 return 自 class 启动此对话框以来的任何数据 activity 不是 Activity(因此,startActivityForResult 无效)。
我该如何解决这个问题?改造整个源是不可能的,因为它超过了 20,000 行。请帮忙!
非UI/main线程的线程无法像对话框一样控制UI元素。但是有一种方法可以在主线程上制作一部分代码运行,然后你就可以做这些事情了。
您想 post 像这样向主处理程序发送一些内容:
new Handler().post(new Runnable{
public void run(){
//Be sure to pass your Activity class, not the Thread
AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);
//... setup dialog and show
}
});
好吧,我终于想通了这个简单的问题。
要在非 UI 线程上调用 Dialog.show(),我需要使用 Looper.getMainLooper() 创建的处理程序对象。然后,正如@peedee 解释的那样,在 运行() 块上实现要做的事情(UI 相关工作)。
接收对话框检索到的数据也不难。在我的对话框 class 上添加一些 getter 方法,并在显示对话框之前添加一个 OnDismissListener 是我所需要的。 (OnDismissListener 将在调用对话框的 dismiss() 函数时做出反应。)
这是我写的代码。希望它能提供帮助。
Handler mHandler = new Handler(Looper.getMainLooper());
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Log.e("TESTRUNNABLE", "RUNNABLE LOADED");
cDialog = new TestDialog(mContext);
cDialog.setTitle("GROUP USER LOGIN");
cDialog.setOnDismissListener(new OnDismissListener(){
@Override
public void onDismiss(DialogInterface dialog) {
// TODO Auto-generated method stub
nameStr = cDialog.getNameStr();
pwStr = cDialog.getPwStr();
Toast.makeText(mContext, nameStr + ", " + pwStr, 3000).show();
Log.e("DISMISSLISTENER", nameStr + ", " + pwStr);
}
});
cDialog.show();
}
}, 0);
我构建了一个 Android 应用程序,它从六个不同的活动中调用与 TCP 套接字相关的线程。它工作得很好,但是当我尝试添加一个简单的对话框时 在启动线程之前询问用户的 id/pw (线程中需要检索到的数据),我遇到了麻烦.有一个适配器class,它实际上被调用来启动线程,但它也不是一个可以实现对话的"Activity"。
有什么更聪明的方法可以解决这个问题吗?添加六个相同的代码来创建对话框,并为每个对话框实现额外的六个相同的处理程序将解决这个问题,但我认为这不是正确的做法。
我试图将对话框设为 Activity(带有对话框主题),但它不能 return 自 class 启动此对话框以来的任何数据 activity 不是 Activity(因此,startActivityForResult 无效)。
我该如何解决这个问题?改造整个源是不可能的,因为它超过了 20,000 行。请帮忙!
非UI/main线程的线程无法像对话框一样控制UI元素。但是有一种方法可以在主线程上制作一部分代码运行,然后你就可以做这些事情了。
您想 post 像这样向主处理程序发送一些内容:
new Handler().post(new Runnable{
public void run(){
//Be sure to pass your Activity class, not the Thread
AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);
//... setup dialog and show
}
});
好吧,我终于想通了这个简单的问题。
要在非 UI 线程上调用 Dialog.show(),我需要使用 Looper.getMainLooper() 创建的处理程序对象。然后,正如@peedee 解释的那样,在 运行() 块上实现要做的事情(UI 相关工作)。
接收对话框检索到的数据也不难。在我的对话框 class 上添加一些 getter 方法,并在显示对话框之前添加一个 OnDismissListener 是我所需要的。 (OnDismissListener 将在调用对话框的 dismiss() 函数时做出反应。)
这是我写的代码。希望它能提供帮助。
Handler mHandler = new Handler(Looper.getMainLooper());
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Log.e("TESTRUNNABLE", "RUNNABLE LOADED");
cDialog = new TestDialog(mContext);
cDialog.setTitle("GROUP USER LOGIN");
cDialog.setOnDismissListener(new OnDismissListener(){
@Override
public void onDismiss(DialogInterface dialog) {
// TODO Auto-generated method stub
nameStr = cDialog.getNameStr();
pwStr = cDialog.getPwStr();
Toast.makeText(mContext, nameStr + ", " + pwStr, 3000).show();
Log.e("DISMISSLISTENER", nameStr + ", " + pwStr);
}
});
cDialog.show();
}
}, 0);