40

我的 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。我也应该手动将视图背景设置为黑色吗?或者主题中的黑色是否可以由系统上的用户自定义?(我不是安卓用户)。

谢谢

4

5 回答 5

85

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

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

例如,假设您在一个片段中,该片段是由网络请求检索的列表,如果您将片段替换为例如 detailFragment 并将其添加到 backStack。

当您返回时,您的片段将重做网络查询,当然您可以缓存它,但为什么呢?这是回到以前的状态,所以添加最后一个片段将处于完全相同的状态,没有任何代码。

默认情况下,片段是透明背景的,因为它们只能用于绘制屏幕的一小部分,但如果您的片段是 match_parent,则只需将其背景设置为一种颜色并继续在片段事务上使用添加。

<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();

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

问候

于 2014-02-17T17:50:16.033 回答
41

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

参考: 请查看管理片段

我希望它会有所帮助!

于 2013-05-16T18:44:30.843 回答
7

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

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

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

于 2016-10-08T20:29:12.857 回答
1

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

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

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

<androidx.constraintlayout.widget.ConstraintLayout
...
android:background="@android:color/darker_gray"
android:clickable="true">
于 2020-05-19T08:04:31.867 回答
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>
于 2020-10-08T14:32:32.110 回答