【AndroidのViewを制する】 表示中のPopupWindowの設定を更新する

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

今回、紹介するPopupWindowは画面の任意の位置に好きなViewをポップアップすることができます。
メソッドがたくさんあるため数回に分割して説明します。
今回はPopupWindow#updateによって設定を更新できるメソッドの使い方を説明します。

PopupWindow#setClippingEnabledを使ってPopupWindowのクリッピングを設定する

PopupWindow#setClippingEnabled()はPopupWindowが画面内におさまるかどうかを設定するメソッドです。
trueを設定するとPopupWindowは画面内におさまるように表示されます。
falseを設定するとPopupWindowは画面外はみ出て表示されます。
PopupWindow#isClippingEnabled()はPopupWindowが画面内におさまるかどうかの設定を取得するメソッドです。
PopupWindowが表示されている状態で設定を変更するメソッドを使用してもPopupWindowには影響がありません。
表示中の場合はPopupWindow#updateを呼び反映することができます。

    final FrameLayout frameLayout = new FrameLayout(this);
    setContentView(frameLayout);

    // PopupWindow内に表示するFrameLayoutを作成する。
    LinearLayout contentView = new LinearLayout(this);
    contentView.setBackgroundColor(Color.LTGRAY);
    contentView.setOrientation(LinearLayout.VERTICAL);
    // PopupWindowのインスタンスを作成する
    final PopupWindow popupWindow = new PopupWindow(contentView , 800 ,800);
    // setClippingEnabled
    Button toggleClippingEnabled = new Button(this);
    toggleClippingEnabled.setText("ClippingEnabledを変更する");
    toggleClippingEnabled.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            popupWindow.dismiss();
            popupWindow.setClippingEnabled(!popupWindow.isClippingEnabled());
            popupWindow.showAtLocation(frameLayout , Gravity.NO_GRAVITY ,800 ,-200);
            Toast.makeText(PopupWindowActivity4.this,"ClippingEnabledを" +  popupWindow.isClippingEnabled() + "に変更しました", Toast.LENGTH_SHORT).show();
        }
    });

    LinearLayout linearLayout = new LinearLayout(this);
    linearLayout.setOrientation(LinearLayout.VERTICAL);
    linearLayout.addView(toggleClippingEnabled);
    frameLayout.addView(linearLayout);

PopupWindow#setFocusableを使ってPopupWindowのフォーカスを制御する

PopupWindow#setFocusableはPopupWindow内のViewがフォーカスされるかどうかを設定するメソッドです。
trueを設定するとPopupWindow内にフォーカスがあたります。
falseを設定するとPopupWindow内にフォーカスがあたりません。
PopupWindow#isFocusableはPopupWindow内にフォーカスが当たるかどうかを取得するメソッドです。
PopupWindowが表示されている状態で設定を変更するメソッドを使用してもPopupWindowには影響がありません。
表示中の場合はPopupWindow#updateを呼び反映することができます。

    final FrameLayout frameLayout = new FrameLayout(this);
    setContentView(frameLayout);

    // PopupWindow内に表示するFrameLayoutを作成する。
    LinearLayout contentView = new LinearLayout(this);
    contentView.setBackgroundColor(Color.LTGRAY);
    contentView.setOrientation(LinearLayout.VERTICAL);
    EditText editText = new EditText(this);
    editText.setHint("入力してください");
    contentView.addView(editText);

    Button button = new Button(this);
    button.setText("トーストを表示する");
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(PopupWindowActivity4.this, "ボタンがクリックされました", Toast.LENGTH_SHORT).show();
        }
    });
    contentView.addView(button);
    // PopupWindowのインスタンスを作成する
    final PopupWindow popupWindow = new PopupWindow(contentView , 800 ,800);
    // setFocusable
    Button toggleFocusable = new Button(this);
    toggleFocusable.setText("setFocusableを使って設定を変更する");
    toggleFocusable.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            popupWindow.dismiss();
            popupWindow.setFocusable(!popupWindow.isFocusable());
            popupWindow.showAsDropDown(v);
            Toast.makeText(PopupWindowActivity4.this,"Focusableを" +  popupWindow.isFocusable() + "に変更しました", Toast.LENGTH_SHORT).show();
        }
    });

    LinearLayout linearLayout = new LinearLayout(this);
    linearLayout.setOrientation(LinearLayout.VERTICAL);
    linearLayout.addView(toggleFocusable);
    frameLayout.addView(linearLayout);

PopupWindow#setTouchableを使ってPopupWindowをタッチを制御する

PopupWindow#setTouchableはPopupWindowがタッチイベントが有効無効を設定するメソッドです。
trueを設定するとPopupWindow内でタッチイベントが発生します。
falseを設定するとPopupWindow内でタッチイベントが発生しません。
PopupWindow#isTouchableはPopupWindow内でタッチイベントが発生するかどうかの設定を取得するメソッドです。
PopupWindowが表示されている状態で設定を変更するメソッドを使用してもPopupWindowには影響がありません。
表示中の場合はPopupWindow#updateを呼び反映することができます。

    final FrameLayout frameLayout = new FrameLayout(this);
    setContentView(frameLayout);

    // PopupWindow内に表示するFrameLayoutを作成する。
    LinearLayout contentView = new LinearLayout(this);
    contentView.setBackgroundColor(Color.LTGRAY);
    contentView.setOrientation(LinearLayout.VERTICAL);
    EditText editText = new EditText(this);
    editText.setHint("入力してください");
    contentView.addView(editText);

    Button button = new Button(this);
    button.setText("トーストを表示する");
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(PopupWindowActivity4.this, "ボタンがクリックされました", Toast.LENGTH_SHORT).show();
        }
    });
    contentView.addView(button);
    // PopupWindowのインスタンスを作成する
    final PopupWindow popupWindow = new PopupWindow(contentView , 800 ,800);
    popupWindow.setTouchable(true);
    popupWindow.setFocusable(true);
    // setFocusable
    Button toggleFocusable = new Button(this);
    toggleFocusable.setText("setFocusableを使って設定を変更する");
    toggleFocusable.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            popupWindow.dismiss();
            popupWindow.setFocusable(!popupWindow.isFocusable());
            popupWindow.showAsDropDown(v);
            Toast.makeText(PopupWindowActivity4.this,"Focusableを" +  popupWindow.isFocusable() + "に変更しました", Toast.LENGTH_SHORT).show();
        }
    });

    LinearLayout linearLayout = new LinearLayout(this);
    linearLayout.setOrientation(LinearLayout.VERTICAL);
    linearLayout.addView(toggleFocusable);
    frameLayout.addView(linearLayout);

PopupWindow#setInputMethodModeを使ってソフトキーボードを制御する

PopupWindow#setInputMethodModeはPopupWindowのInputMethodModeを設定するメソッドです。
  • INPUT_METHOD_FROM_FOCUSABLE : ソフトウェアキーボードが表示された状態でPopupWindowを表示されるとPopupWindow内にフォーカスが移ります。
  • INPUT_METHOD_NEEDED : ソフトウェアキーボードが表示された状態でフォーカスを取得するViewが存在するPopupWindowが表示されるとPopupWindow内のViewにフォーカスが移ります。
  • INPUT_METHOD_NOT_NEEDED : ソフトウェアキーボードが表示された状態でPopupWindowを表示されてもPopupWindow内のViewにフォーカスは移りません。
PopupWindowが表示されている状態で設定を変更するメソッドを使用してもPopupWindowには影響がありません。
PopupWindow#getInputMethodModeはPopupWindowのInputMethodModeを取得するメソッドです。
表示中の場合はPopupWindow#updateを呼び反映することができます。

    final FrameLayout frameLayout = new FrameLayout(this);
    setContentView(frameLayout);

    // PopupWindow内に表示するFrameLayoutを作成する。
    LinearLayout contentView = new LinearLayout(this);
    contentView.setBackgroundColor(Color.LTGRAY);
    contentView.setOrientation(LinearLayout.VERTICAL);
    EditText editText = new EditText(this);
    editText.setHint("入力してください");
    contentView.addView(editText);

    Button button = new Button(this);
    button.setText("トーストを表示する");
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(PopupWindowActivity4.this, "ボタンがクリックされました", Toast.LENGTH_SHORT).show();
        }
    });
    contentView.addView(button);
    // PopupWindowのインスタンスを作成する
    final PopupWindow popupWindow = new PopupWindow(contentView , 800 ,800);
    popupWindow.setTouchable(true);
    popupWindow.setFocusable(true);
    // setInputMethodMode
    Button changeInputMethod = new Button(this);
    changeInputMethod.setText("InputMethodModeを変更する");
    changeInputMethod.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            popupWindow.dismiss();
            int inputMethodMode = popupWindow.getInputMethodMode();
            if(inputMethodMode == PopupWindow.INPUT_METHOD_FROM_FOCUSABLE) {
                popupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
                Toast.makeText(PopupWindowActivity4.this,"InputMethodModeをINPUT_METHOD_NEEDEDに変更しました", Toast.LENGTH_SHORT).show();
            } else if(inputMethodMode == PopupWindow.INPUT_METHOD_NEEDED) {
                popupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED);
                Toast.makeText(PopupWindowActivity4.this,"InputMethodModeをINPUT_METHOD_NOT_NEEDEDに変更しました", Toast.LENGTH_SHORT).show();
            } else {
                popupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_FROM_FOCUSABLE);
                Toast.makeText(PopupWindowActivity4.this,"InputMethodModeをINPUT_METHOD_FROM_FOCUSABLEに変更しました", Toast.LENGTH_SHORT).show();
            }
            popupWindow.showAsDropDown(v);
        }
    });

    LinearLayout linearLayout = new LinearLayout(this);
    linearLayout.setOrientation(LinearLayout.VERTICAL);
    EditText editText1 = new EditText(this);
    linearLayout.addView(editText1);
    linearLayout.addView(changeInputMethod);
    frameLayout.addView(linearLayout);

PopupWindow#setIgnoreCheekPressを使ってチークプレスを無視する

PopupWindow#setIgnoreCheekPressはPopupWindow上で発生するチークプレスを無視するかどうかを設定するメソッドです。
チークプレスとはタッチ領域が小さなタッチイベントを指します。
PopupWindowが表示されている状態で設定を変更するメソッドを使用してもPopupWindowには影響がありません。
表示中の場合はPopupWindow#updateを呼び反映することができます。

    final FrameLayout frameLayout = new FrameLayout(this);
    setContentView(frameLayout);

    // PopupWindow内に表示するFrameLayoutを作成する。
    LinearLayout contentView = new LinearLayout(this);
    contentView.setBackgroundColor(Color.LTGRAY);
    contentView.setOrientation(LinearLayout.VERTICAL);
    EditText editText = new EditText(this);
    editText.setHint("入力してください");
    contentView.addView(editText);

    Button button = new Button(this);
    button.setText("トーストを表示する");
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(PopupWindowActivity4.this, "ボタンがクリックされました", Toast.LENGTH_SHORT).show();
        }
    });
    contentView.addView(button);
    // PopupWindowのインスタンスを作成する
    final PopupWindow popupWindow = new PopupWindow(contentView , 800 ,800);

    // setIgnoreCheekPress
    Button setIgnoreCheekPress = new Button(this);
    setIgnoreCheekPress.setText("setIgnoreCheekPressを設定する");
    setIgnoreCheekPress.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            popupWindow.dismiss();
            popupWindow.setIgnoreCheekPress();
            Toast.makeText(PopupWindowActivity4.this,"setIgnoreCheekPressが設定されました", Toast.LENGTH_SHORT).show();
            popupWindow.showAsDropDown(v);
        }
    });

    LinearLayout linearLayout = new LinearLayout(this);
    linearLayout.setOrientation(LinearLayout.VERTICAL);
    linearLayout.addView(setIgnoreCheekPress);
    frameLayout.addView(linearLayout);

PopupWindow#setAnimationStyleを使って表示時のアニメーションを変更する

PopupWindow#setAnimationStyleはスタイルリソースを指定してPopupWindowが表示・非表示時のアニメーションを設定するメソッドです。
  • デフォルトアニメーションを設定する場合は-1を指定します。
  • アニメーションを無くすためには0を設定します。
  • 任意のアニメーションを設定する場合はstyleリソースを定義し、リソースIDを設定します。
PopupWindow#getAnimationStyleは現在設定されているスタイルリソースを取得します。
PopupWindowが表示されている状態で設定を変更するメソッドを使用してもPopupWindowには影響がありません。
表示中の場合はPopupWindow#updateを呼び反映することができます。

res/values/styles.xmlに下記を追記してください。
  <style name="PopupAnimation" parent="android:Animation" mce_bogus="1">
      <item name="android:windowEnterAnimation">@android:anim/slide_in_left</item>
      <item name="android:windowExitAnimation">@android:anim/slide_out_right</item>
  </style>

    final FrameLayout frameLayout = new FrameLayout(this);
    setContentView(frameLayout);

    // PopupWindow内に表示するFrameLayoutを作成する。
    LinearLayout contentView = new LinearLayout(this);
    contentView.setBackgroundColor(Color.LTGRAY);
    contentView.setOrientation(LinearLayout.VERTICAL);
    EditText editText = new EditText(this);
    editText.setHint("入力してください");
    contentView.addView(editText);

    Button button = new Button(this);
    button.setText("トーストを表示する");
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(PopupWindowActivity4.this, "ボタンがクリックされました", Toast.LENGTH_SHORT).show();
        }
    });
    contentView.addView(button);
    // PopupWindowのインスタンスを作成する
    final PopupWindow popupWindow = new PopupWindow(contentView , 800 ,800);

    // setIgnoreCheekPress
    Button setAnimationStyle = new Button(this);
    setAnimationStyle.setText("アニメーションを変更する");
    setAnimationStyle.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            popupWindow.dismiss();
            if(popupWindow.getAnimationStyle() == R.style.PopupAnimation) {
                popupWindow.setAnimationStyle(-1);
                Toast.makeText(PopupWindowActivity4.this,"デフォルトアニメーションに変更", Toast.LENGTH_SHORT).show();
            } else if(popupWindow.getAnimationStyle() == -1) {
                popupWindow.setAnimationStyle(0);
                Toast.makeText(PopupWindowActivity4.this,"アニメーション無しに変更", Toast.LENGTH_SHORT).show();
            } else {
                popupWindow.setAnimationStyle(R.style.PopupAnimation);
                Toast.makeText(PopupWindowActivity4.this,"カスタムアニメーションに変更", Toast.LENGTH_SHORT).show();
            }
            popupWindow.showAsDropDown(v);
        }
    });

    LinearLayout linearLayout = new LinearLayout(this);
    linearLayout.setOrientation(LinearLayout.VERTICAL);
    linearLayout.addView(setAnimationStyle);
    frameLayout.addView(linearLayout);