【AndroidのViewを制する】 PopupWindowの設定を変更するメソッド群1
今回、紹介する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);