質問編集履歴

1 一部修正

Wind

Wind score 304

2019/02/19 14:18  投稿

メニューを表示する毎に、ナビゲーションバーの表示と非表示が繰り返されてしまいます
#症状
ナビゲーションバーの表示フラグを非表示にしていても、メニューを表示して選択せずに閉じると、
ナビゲーションバーの表示と非表示を繰り返されてしまいます。
##やりたいこと
ナビゲーションバーの表示フラグを`false(非表示)`にしている時は、メニュー表示を選択せずに閉じた後、常に非表示になって欲しい。
(ボタンを押してフラグを`true(表示)`にした時は、ナビゲーションバーが常に表示されている)
##再現手順
1.アプリ起動(ナビゲーションバーが隠れる)
2.「︙」を押してメニューを開く(ナビゲーションバーが表示される)
3.メニュー以外の場所を押して、メニューを選択せずに閉じる
  →ナビゲーションバーは表示されたまま
4.メニュー以外の場所を押して、メニューを選択せずに閉じる
  →ナビゲーションバーは非表示になる(隠れる)
以降、3と4を繰り返されてしまう(ナビゲーションバーの表示と非表示を繰り返されてしまう)
※備考
ボタンを押して表示フラグをtrueにした時は、3と4を繰り返しても常に表示されます。
#ソースコード
activity_main.xml
```XML
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context="agvs.glc.menu_test.MainActivity">
   tools:context="test.menu_test.MainActivity">
   <Button
       android:id="@+id/btnChange"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="Flag Change"
       app:layout_constraintBottom_toBottomOf="parent"
       app:layout_constraintLeft_toLeftOf="parent"
       app:layout_constraintRight_toRightOf="parent"
       app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
```
test_menu.xml
```XML
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http//schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">
   <item
       android:id="@+id/action_settings"
       android:title="Setting"
       android:orderInCategory="100"
       app:showAsAction="never"
       />
   <item
       android:id="@+id/action_license"
       android:title="License"
       android:orderInCategory="101"
       app:showAsAction="never"
       />
</menu>
```
MainActivity.java
```Java
public class MainActivity extends AppCompatActivity {
   boolean bolNavigation_Flag = false; // ナビゲーションバー表示フラグ(デフォルトは非表示)
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       Button _btnChange = findViewById(R.id.btnChange);      // 変更ボタン
       _btnChange.setOnClickListener(new View.OnClickListener(){
           @Override
           public void onClick(View v) {
               bolNavigation_Flag = !bolNavigation_Flag; // ナビゲーションバー表示フラグを反転
               subNavigationBar();
           }
       });
   }
   // オプションメニューを作成する
   public boolean onCreateOptionsMenu(Menu menu){
       // menuにcustom_menuレイアウトを適用
       getMenuInflater().inflate(R.menu.test_menu, menu);
       return true;
   }
   // メニューボタンの制御
   @Override
   public boolean onPrepareOptionsMenu(Menu menu) {
       super.onPrepareOptionsMenu(menu);
       MenuItem menu_settings = menu.findItem(R.id.action_settings);
       MenuItem menu_license = menu.findItem(R.id.action_license);
       // フラグがfalseの時は押せなくする
       menu_settings.setEnabled(bolNavigation_Flag);
       menu_license.setEnabled(bolNavigation_Flag);
       subNavigationBar();    // ナビゲーションバーの制御
       return true;
   }
   // メニュー選択時の処理(テストなのでトースト表示)
   public boolean onOptionsItemSelected(MenuItem menuItem){
       Toast toast;
       // 押されたメニューのIDで処理を振り分ける
       switch (menuItem.getItemId()){
           case R.id.action_settings:
               toast = Toast.makeText(MainActivity.this, "設定を選択", Toast.LENGTH_SHORT);
               break;
           case R.id.action_license:
               toast = Toast.makeText(MainActivity.this, "ライセンスを選択", Toast.LENGTH_SHORT);
               break;
           default:
               toast = Toast.makeText(MainActivity.this, "その他を選択", Toast.LENGTH_SHORT);
           break;
       }
       toast.show();
//       subNavigationBar();        // メニュー選択後に制御する場合
       return true;
   }
   // ナビゲーションバーの表示/非表示
   private void subNavigationBar(){
       View decor = getWindow().getDecorView();
       if(bolNavigation_Flag){ // 表示
           decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE );  // 表示にする
       }else{                     // 非表示
           decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);  // 自動的に隠れる
       }
   }
}
```
  • Java

    16225 questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    7427 questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    4373 questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る