【AndroidのViewを制する】 PopupWindowの設定を変更するメソッド群1

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

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

PopupWindow#setSoftInputModeを使ってPopupWindow表示時のキーボードを設定する

PopupWindow#setSoftInputModeはPopupWindowが表示される時のソフトウェアキーボードの挙動を設定するメソッドです。
引数にはWindowManager.LayoutParams で定義された値を使用します。
このメソッドを使用することでPopupWindowが表示された時にソフトウェアキーボードが表示されるようにすることができます。
PopupWindow#getSoftInputModeは現在の設定を取得するメソッドです。
PopupWindowが表示されている状態で設定を変更するメソッドを使用してもPopupWindowには影響がありません。
表示中の場合はPopupWindowを再表示する必要があります。

    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(PopupWindowActivity5.this, "ボタンがクリックされました", Toast.LENGTH_SHORT).show();
        }
    });
    contentView.addView(button);
    // PopupWindowのインスタンスを作成する
    final PopupWindow popupWindow = new PopupWindow(contentView , 800 ,800);

    // setSoftInputMode
    Button changeSoftInputMode = new Button(this);
    changeSoftInputMode.setText("SoftInputModeを変更する");
    changeSoftInputMode.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            popupWindow.dismiss();
            int softInputMode = popupWindow.getSoftInputMode();
            if(softInputMode == WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) {
                popupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
                Toast.makeText(PopupWindowActivity5.this,"キーボードが表示されないように変更しました", Toast.LENGTH_SHORT).show();
            } else {
                popupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
                popupWindow.setFocusable(true);
                Toast.makeText(PopupWindowActivity5.this,"キーボードが表示されるように変更しました", Toast.LENGTH_SHORT).show();
            }
            popupWindow.showAsDropDown(v);
        }
    });

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

PopupWindow#setOutsideTouchableを使ってPopupWindow外を触った時の挙動を変更する

PopupWindow#setOutsideTouchableはPopupWindowの外を触った時にPopupWindowが閉じるかどうかの挙動を設定するメソッドです。
このメソッドはisTouchableがtrueでisFocusableがfalseの場合に、falseを設定するとPopupWindow外をタッチしてもタッチイベントは後方に流れないようになります。
trueを設定するとPopupWindow外をタッチするとタッチイベントは後方に流れ、PopupWindowは閉じます。
PopupWindow#isOutsideTouchableは現在の設定を取得するメソッドです。
PopupWindowが表示されている状態で設定を変更するメソッドを使用してもPopupWindowには影響がありません。
表示中の場合はPopupWindowを再表示する必要があります。

    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(PopupWindowActivity5.this, "ボタンがクリックされました", Toast.LENGTH_SHORT).show();
        }
    });
    contentView.addView(button);
    // PopupWindowのインスタンスを作成する
    final PopupWindow popupWindow = new PopupWindow(contentView , 800 ,800);

    // setOutsideTouchable
    Button toggleOutsideTouchable = new Button(this);
    toggleOutsideTouchable.setText("OutsideTouchableを変更する");
    toggleOutsideTouchable.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            popupWindow.dismiss();
            popupWindow.setFocusable(false);
            popupWindow.setOutsideTouchable(!popupWindow.isOutsideTouchable());
            popupWindow.showAsDropDown(v);
            Toast.makeText(PopupWindowActivity5.this,"OutsideTouchableを" +  popupWindow.isOutsideTouchable() + "に変更しました", Toast.LENGTH_SHORT).show();
        }
    });

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

PopupWindow#setSplitTouchEnabledを使ってPopupWindow内のViewとPopupWindow外のViewを同時に触った時の挙動を変更する

PopupWindow#setSplitTouchEnabledはPopupWindow内のViewとPopupWindow外のViewを同時にタッチできるかを設定するメソッドです。
trueを設定するとPopupWindow内のViewとPopupWindow外のViewを同時にタッチできるようになります。
falseを設定するとPopupWindow内のViewとPopupWindow外のViewを同時にタッチできないようになります。
PopupWindow#isSplitTouchEnabledは現在の設定を取得するメソッドです。
PopupWindowが表示されている状態で設定を変更するメソッドを使用してもPopupWindowには影響がありません。
表示中の場合はPopupWindowを再表示する必要があります。

    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(PopupWindowActivity5.this, "ボタンがクリックされました", Toast.LENGTH_SHORT).show();
        }
    });
    contentView.addView(button);
    // PopupWindowのインスタンスを作成する
    final PopupWindow popupWindow = new PopupWindow(contentView , 800 ,800);

    // setSplitTouchEnabled
    Button toggleSplitTouchEnabled = new Button(this);
    toggleSplitTouchEnabled.setText("SplitTouchEnabledを変更する");
    toggleSplitTouchEnabled.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            popupWindow.dismiss();
            popupWindow.setSplitTouchEnabled(!popupWindow.isSplitTouchEnabled());
            popupWindow.showAsDropDown(v);
            Toast.makeText(PopupWindowActivity5.this,"SplitTouchEnabledを" +  popupWindow.isSplitTouchEnabled() + "に変更しました", Toast.LENGTH_SHORT).show();
        }
    });

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

PopupWindow#setOverlapAnchorを使ってPopupWindowの表示位置をアンカービューに被せる

PopupWindow#setOverlapAnchorを使ってPopupWindowの表示位置をアンカービューに被せるかを設定するメソッドです。
trueを設定するとPopupWindowを表示する時にアンカービューの左上に被るように表示されるようになります。
falseを設定するとPopupWindowを表示する時にアンカービューの左下に表示されるようになります。
PopupWindow#getOverlapAnchorは現在の設定を取得するメソッドです。
PopupWindowが表示されている状態で設定を変更するメソッドを使用してもPopupWindowには影響がありません。
表示中の場合はPopupWindowを再表示する必要があります。

    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(PopupWindowActivity5.this, "ボタンがクリックされました", Toast.LENGTH_SHORT).show();
        }
    });
    contentView.addView(button);
    // PopupWindowのインスタンスを作成する
    final PopupWindow popupWindow = new PopupWindow(contentView , 800 ,800);

    // setOverlapAnchor
    Button toggleOverlapAnchor = new Button(this);
    toggleOverlapAnchor.setText("OverlapAnchorを変更する");
    toggleOverlapAnchor.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            popupWindow.dismiss();
            popupWindow.setOverlapAnchor(!popupWindow.getOverlapAnchor());
            popupWindow.showAsDropDown(v,0,0);
            Toast.makeText(PopupWindowActivity5.this,"OverlapAnchorを" +  popupWindow.getOverlapAnchor() + "に変更しました", Toast.LENGTH_SHORT).show();
        }
    });

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

PopupWindow#setAttachedInDecorを使ってPopupWindowのアタッチ先を変更する

PopupWindow#setAttachedInDecorはPopupWindowをアタッチ先を変更するメソッドです。
trueを設定するとPopupWindowはコンテンツ領域内に表示されるようになります。
falseを設定するとPopupWindowはステータスバー・コンテンツ・ナビゲーションバーの領域内に表示されるようになります。
PopupWindow#isAttachedInDecorは現在の設定を取得するメソッドです。

    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(PopupWindowActivity5.this, "ボタンがクリックされました", Toast.LENGTH_SHORT).show();
        }
    });
    contentView.addView(button);
    // PopupWindowのインスタンスを作成する
    final PopupWindow popupWindow = new PopupWindow(contentView , 800 ,800);

    // setAttachedInDecor
    Button toggleAttachedInDecor = new Button(this);
    toggleAttachedInDecor.setText("AttachedInDecorを変更する");
    toggleAttachedInDecor.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            popupWindow.dismiss();
            popupWindow.setAttachedInDecor(!popupWindow.isAttachedInDecor());
            popupWindow.showAtLocation(frameLayout, Gravity.NO_GRAVITY,0,0);
            Toast.makeText(PopupWindowActivity5.this,"AttachedInDecorを" +  popupWindow.isAttachedInDecor() + "に変更しました", Toast.LENGTH_SHORT).show();
        }
    });

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

PopupWindow#setElevationを使ってPopupWindowの表示高度を設定する

PopupWindow#setElevationはPopupWindowの表示高度を設定を変更するメソッドです。
デフォルトでは0が設定されいます、正の値を設定することで高度が高くなりPopupWindowに影が表示されるようになります。
PopupWindow#getElevationは現在の設定を取得するメソッドです。

    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(PopupWindowActivity5.this, "ボタンがクリックされました", Toast.LENGTH_SHORT).show();
        }
    });
    contentView.addView(button);
    // PopupWindowのインスタンスを作成する
    final PopupWindow popupWindow = new PopupWindow(contentView , 800 ,800);

    // setElevation
    Button setElevation = new Button(this);
    setElevation.setText("Elevationを変更する");
    setElevation.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            popupWindow.dismiss();
            if(popupWindow.getElevation() == 50) {
                popupWindow.setElevation(0);
            } else {
                popupWindow.setElevation(50);
            }
            popupWindow.showAsDropDown(v);
            Toast.makeText(PopupWindowActivity5.this,"Elevationを" +  popupWindow.getElevation() + "に変更しました", Toast.LENGTH_SHORT).show();
        }
    });

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