###前提・実現したいこと
Android Studio 2.2.3
compileSdkVersion 23
buildToolsVersion "24.0.1"
com.android.support:appcompat-v7:23.4.0
com.android.support:design:23.4.0
Toolbarを用いて画面遷移を行いたいのですが、
Toolbarのmenuitemを選択し、サブ画面からメイン画面へfinish()で戻る際、
画面遷移は成功するのですが、WindowLeakedエラーが発生してしまいます。
メニューが閉じる前にfinishが実行されているのが原因ではないかと考えておりますが、
対策方法がわからずにおります。
###発生している問題・エラーメッセージ
E/WindowManager: android.view.WindowLeaked: Activity teratail.sample.sampleapp.SubActivity has leaked window android.widget.PopupWindow$PopupDecorView{8a7553b V.E...... ......ID 0,0-588,288} that was originally added here at android.view.ViewRootImpl.<init>(ViewRootImpl.java:372) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:299) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:86) at android.widget.PopupWindow.invokePopup(PopupWindow.java:1299) at android.widget.PopupWindow.showAsDropDown(PopupWindow.java:1136) at android.support.v7.widget.AppCompatPopupWindow.showAsDropDown(AppCompatPopupWindow.java:78) at android.support.v4.widget.PopupWindowCompatKitKat.showAsDropDown(PopupWindowCompatKitKat.java:30) at android.support.v4.widget.PopupWindowCompat$KitKatPopupWindowImpl.showAsDropDown(PopupWindowCompat.java:92) at android.support.v4.widget.PopupWindowCompat.showAsDropDown(PopupWindowCompat.java:171) at android.support.v7.widget.ListPopupWindow.show(ListPopupWindow.java:680) at android.support.v7.view.menu.MenuPopupHelper.tryShow(MenuPopupHelper.java:163) at android.support.v7.view.menu.MenuPopupHelper.show(MenuPopupHelper.java:129) at android.support.v7.widget.ActionMenuPresenter.onSubMenuSelected(ActionMenuPresenter.java:298) at android.support.v7.view.menu.MenuBuilder.dispatchSubMenuSelected(MenuBuilder.java:306) at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:976) at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:948) at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:618) at android.support.v7.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:139) at android.view.View.performClick(View.java:5273) at android.view.View$PerformClick.run(View.java:21225) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:224) at android.app.ActivityThread.main(ActivityThread.java:5526) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
###該当のソースコード
- MainActivity.java
java
1package teratail.sample.sampleapp; 2 3import android.content.Intent; 4import android.os.Bundle; 5import android.support.design.widget.FloatingActionButton; 6import android.support.design.widget.Snackbar; 7import android.support.v7.app.AppCompatActivity; 8import android.support.v7.widget.Toolbar; 9import android.view.View; 10import android.view.Menu; 11import android.view.MenuItem; 12 13public class MainActivity extends AppCompatActivity { 14 15 @Override 16 protected void onCreate(Bundle savedInstanceState) { 17 super.onCreate(savedInstanceState); 18 setContentView(R.layout.activity_main); 19 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 20 setSupportActionBar(toolbar); 21 } 22 23 @Override 24 public boolean onCreateOptionsMenu(Menu menu) { 25 getMenuInflater().inflate(R.menu.menu_main, menu); 26 return true; 27 } 28 29 @Override 30 public boolean onOptionsItemSelected(MenuItem item) { 31 switch(item.getItemId()) { 32 case R.id.action_main: 33 break; 34 case R.id.action_sub: 35 startActivity(new Intent(this,SubActivity.class)); 36 break; 37 default: 38 break; 39 } 40 return super.onOptionsItemSelected(item); 41 } 42} 43
- SubActivity.java
java
1package teratail.sample.sampleapp; 2 3import android.content.Intent; 4import android.os.Bundle; 5import android.support.design.widget.FloatingActionButton; 6import android.support.design.widget.Snackbar; 7import android.support.v7.app.AppCompatActivity; 8import android.support.v7.widget.Toolbar; 9import android.view.Menu; 10import android.view.MenuItem; 11import android.view.View; 12 13public class SubActivity extends AppCompatActivity { 14 15 @Override 16 protected void onCreate(Bundle savedInstanceState) { 17 super.onCreate(savedInstanceState); 18 setContentView(R.layout.activity_sub); 19 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 20 setSupportActionBar(toolbar); 21 } 22 @Override 23 public boolean onCreateOptionsMenu(Menu menu) { 24 getMenuInflater().inflate(R.menu.menu_main, menu); 25 return true; 26 } 27 28 @Override 29 public boolean onOptionsItemSelected(MenuItem item) { 30 switch(item.getItemId()) { 31 case R.id.action_main: 32 finish();//←ここでエラー発生 33 break; 34 case R.id.action_sub: 35 break; 36 default: 37 break; 38 } 39 return super.onOptionsItemSelected(item); 40 } 41} 42
- menu_main.xml
Toolbar上のメニュー表示を三点リーダ(…)ではなく、「Menu」という文字列にするために、
menu>item>menuとネストしています
menu_mainの書き方がそもそも間違っているかも??
xml
1<menu xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:app="http://schemas.android.com/apk/res-auto"> 3 <item 4 android:id="@+id/overflow_options" 5 android:title="Menu" 6 app:showAsAction="always"> 7 <menu> 8 <item 9 android:id="@+id/action_main" 10 android:orderInCategory="100" 11 android:title="MainActivity" 12 app:showAsAction="always" /> 13 <item 14 android:id="@+id/action_sub" 15 android:orderInCategory="100" 16 android:title="SubActivity" 17 app:showAsAction="always" /> 18 </menu> 19 </item> 20</menu>
以下、ソースコード全文
https://github.com/Monagano/sampleApp_teratailQ1
###試したこと
finishを遅延実行させたところ、エラーが発生しなかったため、
応急処置として以下のコードを採用しています。
Java
1case R.id.action_main: 2 //finish();//ここだとエラー 3 new Handler().postDelayed(new Runnable() { 4 @Override 5 public void run() { 6 finish();//ここなら正常 7 } 8 },300);//300msは適当な値(100msだと早すぎてエラーとなりました)
finish処理時点でサブメニューの描画処理が終わっていないのが問題だと思うのですが、
サブメニューを明示的に閉じ、完了を待つすべがわかりません。
finish()手前でtoolbar.dismissPopupMenus()を行ってみましたが、改善しませんでした。
android初学者なため、的外れな質問となっていないか不安です。
よろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/19 03:04