English 中文(简体)
AlertDialog无法从ActivityGroup内的ListActivity中显示
原标题:AlertDialog cannot be shown from ListActivity within ActivityGroup

我正试图在单击ListActivity中的项目时显示AlertDialog。我的应用程序在TabActivity的选项卡下显示ListActivity,AlertDialog显示没有问题。ListActivity(称为FavoritesActivity)几乎直接来自Android文档,具有以下设置:

    lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {

                //... code to set the strings station, number, route, and direction

                FavouritesActivity.this.confirmSend(position);
            }
        });

然后

public void confirmSend(final int position) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Are you sure?")
        .setCancelable(true)
        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    //... some code to run here                                                              
                }
            })
        .setNegativeButton("No", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
                }
            });
    AlertDialog alert = builder.create();
    alert.show();
}

然而,在TabActivity的第二个选项卡中,我有一个ActivityGroup,它使用LocalActivityManager来启动另一个ListActivity,就像这样(同样,与在线选项卡下嵌套列表的教程几乎没有变化):

public class MyGroupActivity extends ActivityGroup {

// Keep this in a static variable to make it accessible for all the nesten activities, lets them manipulate the view                                      
public static MyGroupActivity group;

// Need to keep track of the history if you want the back-button to work properly, don t use this if your activities requires a lot of memory.            
private ArrayList<View> history;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.history = new ArrayList<View>();
    group = this;

    // Start the root activity withing the group and get its view                                                                                         
    View view = getLocalActivityManager().startActivity("FirstListActivity", new
                                                        Intent(this,FirstListActivity.class)
                                                        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
        .getDecorView();

    // Replace the view of this ActivityGroup                                                                                                             
    replaceView(view);

}

public void replaceView(View v) {
    // Changes this Groups View to the new View.                                                                                                          
    setContentView(v);
}

这里的FirstListActivity是一个ListActivity,它是一个系列中的第一个。用户选择一个项目并显示另一个ListActivity,代码如下:

    lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                Intent intent = new Intent();
                intent.setClass(FirstListActivity.this, TheNextListActivity.class);                                                                                                                

                // Create View using the Group Activity s LocalActivityManager                                                                            
                View newview = MyGroupActivity.group.getLocalActivityManager()
                    .startActivity("show_routes", intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
                    .getDecorView();
                // And replace the view                                                                                                                   
                MyGroupActivity.group.replaceView(newview);
            }
        });

本系列中的最后一个ListActivity具有与我展示的第一个ListActivity示例(确实有效的示例)完全相同的onItemClick侦听器和相关的confirmSend函数,但现在当用户单击某个项目时,AlertDialog无法显示,应用程序意外停止,并显示以下调试输出:

W/WindowManager(  570): Attempted to add application window with unknown token android.os.BinderProxy@4373af30.  Aborting.
D/AndroidRuntime( 1953): Shutting down VM
W/dalvikvm( 1953): threadid=3: thread exiting with uncaught exception (group=0x4000fe70)
E/AndroidRuntime( 1953): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 1953): android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord@43750f98 is not valid; is your activity running?
E/AndroidRuntime( 1953):    at android.view.ViewRoot.setView(ViewRoot.java:425)
E/AndroidRuntime( 1953):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:178)
E/AndroidRuntime( 1953):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/AndroidRuntime( 1953):    at android.view.Window$LocalWindowManager.addView(Window.java:392)
E/AndroidRuntime( 1953):    at android.app.Dialog.show(Dialog.java:231)
E/AndroidRuntime( 1953):    at com.ttcsms.LastListActivity.confirmSend(LastListActivity.java:119)
E/AndroidRuntime( 1953):    at com.ttcsms.LastListActivity$1.onItemClick(LastListActivity.java:66)
E/AndroidRuntime( 1953):    at android.widget.AdapterView.performItemClick(AdapterView.java:283)
E/AndroidRuntime( 1953):    at android.widget.ListView.performItemClick(ListView.java:3132)
E/AndroidRuntime( 1953):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:1620)
E/AndroidRuntime( 1953):    at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime( 1953):    at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime( 1953):    at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 1953):    at android.app.ActivityThread.main(ActivityThread.java:3948)
E/AndroidRuntime( 1953):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 1953):    at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 1953):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
E/AndroidRuntime( 1953):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
E/AndroidRuntime( 1953):    at dalvik.system.NativeStart.main(Native Method)
I/Process (  570): Sending signal. PID: 1953 SIG: 3
I/dalvikvm( 1953): threadid=7: reacting to signal 3
I/dalvikvm( 1953): Wrote stack trace to  /data/anr/traces.txt 
I/Process ( 1953): Sending signal. PID: 1953 SIG: 9
I/ActivityManager(  570): Process com.ttcsms (pid 1953) has died.

导致此故障的这两条通往AlertDialog的路线之间有什么区别?这似乎与AlertDialog.Cuilding(这个)位有关。当在ActivityGroup内部时,它得到了错误的上下文或其他什么。我在网上发现的每个关于这个错误的例子都是通过在“this”和“getApplicationContext()”之间切换来解决的,但在这种情况下,这两个都不起作用。我尝试了其他变体来获取上下文,但由于我大多是随机猜测,我认为最好在这里征求建议。我应该传递什么上下文,或者,还有什么错误?

最佳回答

明白了!实际上,这是一个Android上下文问题。

排队:

AlertDialog.Builder构建器=新的AlertDialog.Bilter(this);

您应该传递TabActivity的上下文,而不是this,传递可见/主活动的上下文以显示活动中的任何弹出窗口。

因此,简单的解决方案:

  1. Store context of TabActivity for later use in pop-up.
  2. Pass TabActivity Context in pop-up code instead of this.

hope this helps. cheers :)

问题回答

Finally followed your approach and solved my problem. Here i am giving some details

create a context to the Tabactivity class as follows.

"public static MyTabactivity context;"

在MyTabactivity的onCreate方法中的assgin“context=this”
然后在您的警报框中使用MyTabactivity.conf,如下所示。

“AlertDialog.Builder adb=新AlertDialog.BBuilder(MyTabactivity.context);”

我希望这会有所帮助。。。。。

为了简单起见,您可以直接在AlertDialog中传递getParent()作为上下文,而不是定义上下文变量并将其设置在onCreate上。





相关问题
Android - ListView fling gesture triggers context menu

I m relatively new to Android development. I m developing an app with a ListView. I ve followed the info in #1338475 and have my app recognizing the fling gesture, but after the gesture is complete, ...

AsyncTask and error handling on Android

I m converting my code from using Handler to AsyncTask. The latter is great at what it does - asynchronous updates and handling of results in the main UI thread. What s unclear to me is how to handle ...

Android intent filter for a particular file extension?

I want to be able to download a file with a particular extension from the net, and have it passed to my application to deal with it, but I haven t been able to figure out the intent filter. The ...

Android & Web: What is the equivalent style for the web?

I am quite impressed by the workflow I follow when developing Android applications: Define a layout in an xml file and then write all the code in a code-behind style. Is there an equivalent style for ...

TiledLayer equivalent in Android [duplicate]

To draw landscapes, backgrounds with patterns etc, we used TiledLayer in J2ME. Is there an android counterpart for that. Does android provide an option to set such tiled patterns in the layout XML?

Using Repo with Msysgit

When following the Android Open Source Project instructions on installing repo for use with Git, after running the repo init command, I run into this error: /c/Users/Andrew Rabon/bin/repo: line ...

Android "single top" launch mode and onNewIntent method

I read in the Android documentation that by setting my Activity s launchMode property to singleTop OR by adding the FLAG_ACTIVITY_SINGLE_TOP flag to my Intent, that calling startActivity(intent) would ...

From Web Development to Android Development

I have pretty good skills in PHP , Mysql and Javascript for a junior developer. If I wanted to try my hand as Android Development do you think I might find it tough ? Also what new languages would I ...

热门标签