web-dev-qa-db-ja.com

フラグメントは透明で、以下のアクティビティが表示されます

My Androidアプリケーションは、SherlockFragmentActivityのサブクラスであるBeginActivityを起動し、次を使用して最初のビューを表示します。

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (getSupportFragmentManager().findFragmentById(Android.R.id.content) == null) {
            Fragment f = LoginFragment.newInstance();

            getSupportFragmentManager()
                    .beginTransaction()
                    .add(Android.R.id.content, f, "loginfragment")
                    .attach(f)
                    .commit();
        }
}

LoginFragmentには、次のようなビューが表示されます。

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.login, container, false);

        // Get pointers to text views
        usernameField = (EditText) v.findViewById(R.id.usernameLog);
        passwordField = (EditText) v.findViewById(R.id.passwordLog);
        progressBar = (ProgressBar) v.findViewById(R.id.progressBarLog);
        // Set button click listeners for both buttons
        Button b = (Button) v.findViewById(R.id.loginButton);
        b.setOnClickListener(this);

        return v;
    }

ログインをクリックすると、次のようなリストビューが表示されます。

BeginActivity top = (BeginActivity) getActivity();
Fragment f = OfferListFragment.newInstance();
        top.getSupportFragmentManager()
                .beginTransaction()
                .add(Android.R.id.content, f, "offerList")
                .addToBackStack(f.getClass().getSimpleName())
                .commit();

最後に、OfferListFragmentのビューは次のように表示されます。

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.offers, container, false);

        return v;
    }

今私が抱えている問題は、最終的なOfferListFragmentが透明であるように見え、その下にログイン画面が表示されることです。背景が黒のTheme.Sherlockを使用しています。ビューの背景を手動で黒に設定する必要がありますか?または、システムのユーザーがテーマの黒をカスタマイズできますか? (私はAndroidユーザー)ではありません。

ありがとう

36
Darren

単に追加するのではなく、FragmentTransactionクラスを使用してフラグメントをreplaceしてみてください。

説明:

各トランザクションは、同時に実行する一連の変更です。 add()remove()replace()などのメソッドを使用して、特定のトランザクションに対して実行するすべての変更を設定できます。次に、トランザクションをアクティビティに適用するには、commit()を呼び出す必要があります。

ただし、commit()を呼び出す前に、addToBackStack()を呼び出して、トランザクションをフラグメントトランザクションのバックスタックに追加することができます。このバックスタックはアクティビティによって管理され、ユーザーは[戻る]ボタンを押すことで前のフラグメント状態に戻ることができます。

たとえば、あるフラグメントを別のフラグメントに置き換え、前の状態をバックスタックに保持する方法は次のとおりです。

例:

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

リファレンス:をご覧ください フラグメントの管理

お役に立てばと思います!!

36
Mehul Joisar

私見私はこの答えに同意しません。

フラグメントを置き換えることも、追加することもできます。

たとえば、フラグメントをdetailFragmentに置き換えてbackStackに追加すると、ネットワーク要求によって取得されたリストであるフラグメントにいるとしましょう。

戻ると、フラグメントはネットワーククエリをやり直します。もちろん、キャッシュすることもできますが、なぜですか?以前の状態に戻っているため、追加すると、最後のフラグメントはまったくコードなしでまったく同じ状態になります。

フラグメントは画面のごく一部をペイントするために使用できるため、デフォルトでは透明な背景になっていますが、フラグメントがmatch_parentの場合は、背景を色に設定し、fragmentTransactionでaddを使用し続けるだけです。

<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/scrollView1"
Android:background="@Android:color/white"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" >

これがフラグメントレイアウトXMLのルート要素になり、線形などになります。トランザクションコードは次のとおりです。

YourFragment detail = YourFragment.newInstance(Id);
ft.add(R.id.contentHolder, detail);
ft.addToBackStack(TAG);
ft.commit();

これが、通常は最良のケースではない、置換する追加を変更せずに、無地の背景を表示する方法を知りたい人の助けになることを願っています。

よろしく

76
Goofyahead

私は多くのテクニックを使用しましたが、ゲインはありません最後に、コンテナの背景またはこのようなフラグメントレイアウトを追加することで修正しました

Android:background="@Android:color/white"    

レイアウトまたはコンテナビューに追加するだけで、フラグメントが役立つことを願っています。

4
Sultan Ali