ViewPagerとFragmentPagerAdapterを3つのフラグメントを持つ1つのアクティビティでセットアップしています。すべてのフラグメントは同時にロードされ、メモリ内に保持されます
mPager.setOffscreenPageLimit(2);
これらのフラグメントの1つは、ステータスバーやアクションバーのないフルスクリーンにしたいカメラプレビューをホストします。他のフラグメントでは、アクションバーを表示する必要があります。
他の2つのフラグメントを正常に保ちながら、カメラプレビューフラグメントのみを全画面表示するにはどうすればよいですか?テーマを使用してみました。つまり、アクションバーが壊れています。
プログラムで次の呼び出しを行うと、アクティビティ全体が強制的にフルスクリーンになります(したがって、他の2つのフラグメントも一緒になります)。
requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
ViewPager.OnPageChangeListenerの実装も試みました。
public void onPageSelected(int position) {
if(position == 1)
getActionBar().hide();
else
getActionBar().show();
}
これにより、アクションバーは非表示になりますが、システムステータスバーは非表示になりません(通知、ステータスアイコン、および時刻はどこにあるのかについて説明しています)。
私が正確にやりたいことの例については、Snapchatを参照してください-彼らはカメラと他の断片の間のスワイプを完全に引き離します。
編集:
そこで、onPageSelectedを次のように変更しました。
public void onPageSelected(int position) {
if(position == 1) {
MainActivity.this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
MainActivity.this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
} else {
MainActivity.this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
MainActivity.this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
}
}
これにより、ステータスバーを表示するかどうかを変更できます。ただし、大量のジャンクが発生します。アクションバーと同じ問題。
Snapchatでは、タブの変更が完了するとステータスバーが上下にスライドします。これを実装する方法がわからないので、この側面に関するアドバイスをいただければ幸いです。
これを行う方法を見つけましたが、それは間違いなくハックです。
トリックはAndroidアクションバーを使用するのではなく、レイアウトファイルに独自のものを作成することです。
コードでさらに2つのRelativeLayoutを定義しました。
<RelativeLayout
Android:id="@+id/padding"
Android:layout_width="fill_parent"
Android:layout_height="25dip"
Android:layout_alignParentTop="true"
Android:background="@color/abs__background_holo_dark" />
<RelativeLayout
Android:id="@+id/fake_action_bar"
Android:layout_width="fill_parent"
Android:layout_height="48.0dip"
Android:layout_below="@id/padding" >
<!-- stuff here -->
</RelativeLayout>
上のRelativeLayoutは、Androidステータスバーにパディングします。25dipに設定しますが、異なる場合があります。おそらく、この値をプログラムで設定するのが最善です。また、ステータスバーの色と一致し、UIがより自然に見えるように黒色で表示されます。
下部のRelativeLayoutは、偽のアクションバー用です。アクションバーに必要なものすべて(タイトルテキスト、ボタンなど)をこのRelativeLayoutに詰め込む必要があります。 48dipに設定しましたが、これもさまざまなので、おそらくプログラムで設定する必要があります。
Fragments、ViewPager、FragmentPagerAdapterをホストするアクティビティで、ステータスバーをオーバーレイにするためにAndroidを伝えるフラグを設定する必要があります。
WindowManager.LayoutParams params = getWindow().getAttributes();
params.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
次に、フラグメントを切り替えるときにステータスバーを非表示および表示にする必要があります。アクティビティにViewPager.OnPageChangeListenerを実装してから、次のコードを使用します。
@Override
public void onPageScrollStateChanged(int state) {
switch(state) {
case ViewPager.SCROLL_STATE_IDLE:
if(mPosition == 1) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
} else {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
}
}
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
mPosition = position;
}
OnPageSelectedを使用してページ番号を追跡し、onPageScrollStateChangedでそれを使用して、現在表示されているフラグメントに応じてステータスバーを動的に非表示/表示します。 onPageSelectedでこれを行うことはできません。これにより、スワイプの途中でステータスバーが再表示されるためです。
また、偽のアクションバーに適切なコードを追加する必要があります。ボタンの場合、これはOnClickListenerになります。
最初に、ステータスバーを非表示にするアクティビティ/フラグメントで、フラグメントのパブリックスタティックを作成します。
public static Fragment QSFrag;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
QSFrag = this;
}
次に、onPageSelectedで:
public void onPageSelected(int position) {
// TODO Auto-generated method stub
if(position == 1){
mActionBar.hide();
YourActivityWithNoStatusOrActionBar.QSFrag.getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
}else{
mActionBar.show();
// mActionBar.setSelectedNavigationItem(position); I use this, not sure u need/want it.
}
}
私はそれをテストしましたが、動作します。しかし、ステータスバーなしでフラグメントを離れるとき、それは素晴らしいように見えません。 :p