2011-11-28 96 views
2

我正在創建一個類似於Android的Google搜索部件的部件。如何在Google搜索小部件中創建彈出式菜單?

enter image description here

過得好他們實現上點擊過濾器的行動迅速彈出?

這裏(用「G」標誌的最左邊的項目)是它的代碼 - 在我的應用程序控件提供者,我有以下 -

Intent activityIntent = new Intent(context, SearchActivity.class); 
Bundle infoBundle = new Bundle(); 
infoBundle.putBoolean(HOME_BUTTON_CLICKED, true); 
activityIntent.putExtras(infoBundle); 
activityIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
PendingIntent homeButtonPI = PendingIntent.getActivity(context, requestCode, activityIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
views.setOnClickPendingIntent(R.id.homeButton, homeButtonPI); 

在我SearchActivity我在我的onCreate有這樣的() -

if(bundle.getBoolean(CMWidget.HOME_BUTTON_CLICKED)) { 
    showQuickAction((ImageButton)findViewById(R.id.home_button)); 
} 

下面是實際帶來的彈出窗口中的showQuickAction()函數 -

public void showQuickAction(View view){ 
     //populate the quick action 
     quickAction = new QuickAction(view, SearchActivity.this); 
    final ImageButton homeButton = (ImageButton)findViewById(R.id.home_button); 
    final ActionItem quickActionEverything = new ActionItem(); 
    quickActionEverything.setTitle("Everything"); 
    quickActionEverything.setIcon(getResources().getDrawable(R.drawable.logo)); 
    quickActionEverything.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      quickAction.dismiss(); 

      CONTENT_TYPE = CONTENT_EVERYTHING; 

      homeButton.setImageResource(R.drawable.logo_arrow); 
      searchBox.setHint(R.string.search); 

      if(previousContentType != CONTENT_TYPE && queryString.length() != 0){ 
       emptyListContents(); 
       cancelRunningWSCall(); 
       startSearch(queryString); 
      } 
      else if(queryString.length() != 0) 
       populateList(CONTENT_TYPE); 

      else if(queryString.length() == 0) 
       showRecentSearches(); 

      showSoftKeyboard(); 
      previousContentType = CONTENT_TYPE; 
     } 
    }); 

    final ActionItem quickActionContacts = getQuickActionItem(homeButton, CONTENT_CONTACTS, R.drawable.contacts, R.drawable.contacts_arrow); 
    final ActionItem quickActionMails = getQuickActionItem(homeButton, CONTENT_MAILS, R.drawable.mails, R.drawable.mails_arrow); 
    final ActionItem quickActionCalendars = getQuickActionItem(homeButton, CONTENT_CALENDARS, R.drawable.calendars, R.drawable.calendars_arrow); 
    final ActionItem quickActionDocuments = getQuickActionItem(homeButton, CONTENT_DOCUMENTS, R.drawable.docs, R.drawable.docs_arrow); 


    quickAction.addActionItem(quickActionEverything); 
    quickAction.addActionItem(quickActionMails); 
    quickAction.addActionItem(quickActionCalendars); 
    quickAction.addActionItem(quickActionDocuments); 


    quickAction.show(); 
} 

這裏是我的堆棧跟蹤以及 -

STACK_TRACE=java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.android/com.test.android.SearchActivity}: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2787) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803) 
at android.app.ActivityThread.access$2300(ActivityThread.java:135) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136) 


at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:144) 
at android.app.ActivityThread.main(ActivityThread.java:4937) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? 
at android.view.ViewRoot.setView(ViewRoot.java:509) 
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
at android.view.Window$LocalWindowManager.addView(Window.java:424) 
at android.widget.PopupWindow.invokePopup(PopupWindow.java:828) 
at android.widget.PopupWindow.showAsDropDown(PopupWindow.java:740) 
at com.test.android.QuickAction.show(QuickAction.java:68) 
at com.test.android.SearchActivity.showQuickAction(SearchActivity.java:1541) 
at com.test.android.SearchActivity.onCreate(SearchActivity.java:219) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751) 
... 11 more 

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? 
at android.view.ViewRoot.setView(ViewRoot.java:509) 
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
at android.view.Window$LocalWindowManager.addView(Window.java:424) 
at android.widget.PopupWindow.invokePopup(PopupWindow.java:828) 
at android.widget.PopupWindow.showAsDropDown(PopupWindow.java:740) 
at com.test.android.QuickAction.show(QuickAction.java:68) 
at com.test.android.SearchActivity.showQuickAction(SearchActivity.java:1541) 
at com.test.android.SearchActivity.onCreate(SearchActivity.java:219) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803) 
at android.app.ActivityThread.access$2300(ActivityThread.java:135) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136) 


at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:144) 
at android.app.ActivityThread.main(ActivityThread.java:4937) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
at dalvik.system.NativeStart.main(Native Method) 

編輯:我搬到了showQuickAction()函數的onResume()和還調用onStart()。沒有運氣:(

這裏還有一個堆棧跟蹤 -

java.lang.RuntimeException: Unable to resume activity {com.test.android/com.test.android.SearchActivity}: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? 
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3347) 
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3362) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2808) 

at android.app.ActivityThread.access$2300(ActivityThread.java:135) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:144) 
at android.app.ActivityThread.main(ActivityThread.java:4937) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? 
at android.view.ViewRoot.setView(ViewRoot.java:509) 
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
at android.view.Window$LocalWindowManager.addView(Window.java:424) 
at android.widget.PopupWindow.invokePopup(PopupWindow.java:828) 
at android.widget.PopupWindow.showAsDropDown(PopupWindow.java:740) 
at com.test.android.QuickAction.show(QuickAction.java:68) 
at com.test.android.SearchActivity.showQuickAction(SearchActivity.java:1546) 
at com.test.android.SearchActivity.onResume(SearchActivity.java:262) 
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1255) 
at android.app.Activity.performResume(Activity.java:3864) 
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3337) 
... 12 more 

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? 
at android.view.ViewRoot.setView(ViewRoot.java:509) 
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
at android.view.Window$LocalWindowManager.addView(Window.java:424) 
at android.widget.PopupWindow.invokePopup(PopupWindow.java:828) 
at android.widget.PopupWindow.showAsDropDown(PopupWindow.java:740) 
at com.test.android.QuickAction.show(QuickAction.java:68) 
at com.test.android.SearchActivity.showQuickAction(SearchActivity.java:1546) 
at com.test.android.SearchActivity.onResume(SearchActivity.java:262) 
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1255) 
at android.app.Activity.performResume(Activity.java:3864) 
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3337) 
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3362) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2808) 


at android.app.ActivityThread.access$2300(ActivityThread.java:135) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:144) 
at android.app.ActivityThread.main(ActivityThread.java:4937) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
at dalvik.system.NativeStart.main(Native Method) 

回答

2

他們通過PendingIntent開始正常活動與表示活動應該顯示這個子菜單中的動作

你什麼時候看到logcat的。點擊該按鈕:

I/ActivityManager( 167): Starting: Intent { act=com.android.quicksearchbox.action.QSB_AND_SELECT_CORPUS flg=0x14200000 pkg=com.google.android.googlequicksearchbox cmp=com.google.android.googlequicksearchbox/.SearchActivity bnds=[14,86][86,169] (has extras) } from pid -1 

,而不是當你點擊搜索文本框:

I/ActivityManager( 167): Starting: Intent { act=android.search.action.GLOBAL_SEARCH flg=0x14200000 pkg=com.google.android.googlequicksearchbox cmp=com.google.android.googlequicksearchbox/.SearchActivity bnds=[86,95][384,160] (has extras) } from pid -1 

act=..與意圖發送的動作)


編輯到ADRESS新的細節,在這裏看到的評論:

我覺得這裏的問題是,您嘗試從onCreate()打開Quickaction對話框。你的活動在那裏準備好了,但還沒有看到。如果您現在添加對話框,它會引用它的父級活動並指出它不可見。哪個給你這個錯誤。嘗試將額外的解析和快速操作對話框的創建移至活動生命週期中的稍後時間點。我猜onStart()是這個最好的地方。

+0

好吧,我做了同樣的事情。我使用Pending Intent開始了一項活動。在活動中,我調用了一個顯示彈出窗口的函數。但是,我的應用程序崩潰了Bad Token異常 - 「您的活動正在運行嗎?」信息。 後來我用了一個線程,延遲了0.5s,然後調用了相同的函數。有用。這延遲的事情有點令人毛骨悚然。有沒有其他方法可以解決這個問題? – Enigma

+0

很難說沒有看到代碼是誠實的。聽起來像某些東西是關閉的,但不能說出什麼。對我來說似乎不正常。如果你真的想知道/修復,我會說打開一個新的問題,其中包括與解釋和堆棧跟蹤的代碼。 – 2011-11-28 14:09:24

+0

我用代碼更新了這個問題。 – Enigma

0

這是快速對話框。看看這個example。但首先你應該開始一個活動