片段是透明的,并在下面显示活动

时间:2013-05-15 21:20:54

标签: android actionbarsherlock fragment

我的Android应用程序启动到BeginActivity,它是SherlockFragmentActivity的子类,并使用以下命令显示它的第一个视图:

@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用户)。

由于

5 个答案:

答案 0 :(得分:76)

恕我直言,我不同意这个答案。

您可能想要替换您的片段,或者您可能想要添加它。

例如,假设您在一个片段中,该片段是由网络请求检索的列表,如果您使用let更改片段替换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();

希望这可以帮助那些想知道如何在不改变添加替换的情况下看到稳固背景的人,这通常不是最好的情况。

此致

答案 1 :(得分:36)

尝试使用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();

<强>参考: 请查看Managing Fragments

我希望它会有所帮助!!

答案 2 :(得分:4)

我使用了许多技术但没有获得 最后我通过添加容器的背景或像这样的片段布局来修复它

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

您只需要在您的布局或片段的容器视图中添加 希望它会有所帮助

答案 3 :(得分:0)

好吧,为片段提供背景并不总是足够的。例如,如果您的背景活动或片段包含按钮,那么我们应该为FragmeLayout设置高程,以便我们的片段位于其他元素之上。像这样:

    <FrameLayout
    android:elevation="5dp"
    ... />

,然后在我们的片段布局中,我们应该设置背景并将clickable属性设置为true,以防止按钮在背景活动或片段中工作。像这样的东西:

<androidx.constraintlayout.widget.ConstraintLayout
...
android:background="@android:color/darker_gray"
android:clickable="true">

答案 4 :(得分:0)

没有人提到,如果您在Fragment中添加了背景,但是背景仍然是透明的,则需要检查FrameLayout是XML中的最后一个视图。

因为Android中的z-index由XML位置计算,并且层次结构中最低的视图具有最高的z-index。

例如,我最近通过简单地将FrameLayout从此处移来解决了这个问题:

<androidx.coordinatorlayout.widget.CoordinatorLayout
  ...>

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <RelativeLayout
      ...>
    </RelativeLayout>

    <RelativeLayout
      ...>
    </RelativeLayout>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

到这里:

<androidx.coordinatorlayout.widget.CoordinatorLayout
  ...>

    <RelativeLayout
      ...>
    </RelativeLayout>

    <RelativeLayout
      ...>
    </RelativeLayout>

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>