web-dev-qa-db-ja.com

フラグメントをプログラムで全画面表示する

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では、タブの変更が完了するとステータスバーが上下にスライドします。これを実装する方法がわからないので、この側面に関するアドバイスをいただければ幸いです。

20
Eric Ahn

これを行う方法を見つけましたが、それは間違いなくハックです。

トリックは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になります。

13
Eric Ahn

最初に、ステータスバーを非表示にするアクティビティ/フラグメントで、フラグメントのパブリックスタティックを作成します。

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

3
LordMarty