片段隐藏在 Android 中不起作用

Fragment hide not working in Android

我的要求是,我有一个主 activity,我想在单独的片段中显示图像和文本而不是进度条。 我有一个单独的片段,我想在用户单击 MainActivity 中的按钮时显示该片段。

我的问题是,当我启动应用程序时,片段会默认显示。我希望片段仅在用户单击按钮时显示。当我启动应用程序时,我希望显示 activity。

我有一个 activity_main xml 如下

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background" >

    <ScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_marginTop="10dp"
            android:orientation="vertical" >

            <TableLayout
                android:id="@+id/tableLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:stretchColumns="*" >

                <TableRow
                    android:id="@+id/tableRow1"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="20dip" >

                    <TextView
                        android:id="@+id/text1"
                        style="@style/textForLabel"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="10dip"
                        android:text="@string/text1" />

                    <Spinner
                        android:id="@+id/spinner1"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginRight="20dip"
                        android:layout_weight="1"
                        android:drawSelectorOnTop="true"
                        android:prompt="@string/spinner1"
                        android:spinnerMode="dialog" >
                    </Spinner>
                </TableRow>

                <TableRow
                    android:id="@+id/tableRow2"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" >

                    <TextView
                        android:id="@+id/text2"
                        style="@style/textForLabel"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="10dip"
                        android:text="@string/label2" />

                    <Spinner
                        android:id="@+id/spinner2"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginRight="20dip"
                        android:layout_span="6"
                        android:layout_weight="1"
                        android:drawSelectorOnTop="true"
                        android:prompt="@string/spinner2"
                        android:spinnerMode="dropdown" />
                </TableRow>
            </TableLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:gravity="center"
                android:orientation="horizontal" >

                <TextView
                    android:id="@+id/text3"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text=""
                    android:textColor="@color/red"
                    android:textSize="@dimen/text_medium"
                    android:textStyle="bold" />
            </LinearLayout>
        </LinearLayout>
    </ScrollView>

    <fragment
        android:id="@+id/progress_bar_fragment"
        android:name="com.test.pushnotificationeclipse.ProgressBarFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

fragemnt_progress_bar.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/NoActionBar"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background_all" >

    <ImageView
        android:id="@+id/imageView_frag_pgbar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/text_frag_pgbar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/imageView_frag_pgbar"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="74dp"
        android:textColor="@color/basic_color"
        android:textSize="@dimen/text_medium_large" />

</RelativeLayout>

我的ProgressBarFragment.java如下

public class ProgressBarFragment extends Fragment {

    @InjectView(R.id.text_frag_pgbar)
    TextView textView;

    @InjectView(R.id.imageView_frag_pgbar)
    ImageView imageView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_progress_bar, container,
                false);
        ButterKnife.inject(this, view);

        return view;
    }

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

    }

    @Override
    public void onDetach() {
        super.onDetach();
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    }

    @Override
    public void onResume() {
        super.onResume();
    }
}

我的 MainActivity.java 如下:当我将 true 传递给 hideAndShowFragment() 时,应该隐藏片段,当我传递 false 时应该显示片段。

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.inject(this);
        context = getApplicationContext();
        hideAndShowFragment(true);
    }

    public void hideAndShowFragment(boolean hide) {
        FragmentManager fm = getFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ProgressBarFragment pf = new ProgressBarFragment();
        if (hide) {
            ft.hide(pf).commit();
        } else {
            ft.show(pf).commit();
        }
    }
}
 FragmentManager fm = getFragmentManager();
    fm.beginTransaction()
              .setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out)
              .show(yourfragment)
              .commit();

Ps:-Dont Don't mess with the visibility flags of the container - FragmentTransaction.hide/show does that internally for you.

源:- ""

这里的问题是您的 hideAndShowFragment 方法。您正在创建 ProgressBarFragment 的新实例,但 FragmentTransaction 隐藏和显示方法仅适用于附加片段。

相反,您应该通过 id.

获取您已经在 XML 中定义的片段
public void hideAndShowFragment(boolean hide) {
    FragmentManager fm = getFragmentManager();
    ProgressBarFragment pf = 
        (ProgressBarFragment) fm.findFragmentById(R.id.progress_bar_fragment);
    FragmentTransaction ft = fm.beginTransaction();
    if (hide) {
        ft.hide(pf).commit();
    } else {
        ft.show(pf).commit();
    }
}

此外,这一行涉及:

context = getApplicationContext();

你的 Activity 也是一个 Context 对象,所以除非你需要特定于应用程序的上下文,否则你通常希望在你需要上下文的地方使用 this activity。

您最好在代码中获取片段实例并使用官方文档中的技术,如下所示和 here(搜索 'newInstance')。将以下静态方法添加到您的片段中。

public static ProgressFragment newInstance() {
    DetailsFragment f = new DetailsFragment();

    // Supply args here if needed.
    /*Bundle args = new Bundle();
    args.putInt("index", index);
    f.setArguments(args);*/

    return f;
}

完成后,您可以使用按钮单击方法内的以下片段事务代码将片段添加到顶视图布局。

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction tr = fm.beginTransaction();
tr.add(android.R.id.content, ProgressFragment.newInstance(), "ProgressFragmentTag");
tr.commit();

然后您可以根据需要使用以下代码删除该片段;

FragmentManager fm = getSupportFragmentManager();
ProgressFragment frag = fm.findFragmentByTag("ProgressFragmentTag")
if (frag!=null)
{
   FragmentTransaction tr = fm.beginTransaction();
   tr.remove(frag).commit();
}

希望对您有所帮助!

我通过添加片段而不是显示它来解决它:

public void hideAndShowFragment(boolean hide) {
        FragmentManager fm = getFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ProgressBarFragment pf = (ProgressBarFragment) fm.findFragmentById(R.id.progress_bar_fragment);
        if (hide) {
            ft.hide(pf).commit();
        } else {
ft.add(android.R.id.content, pf, "ProgressFragmentTag").commit();
        }
    }
          int count =1;
           if (count == 1) {


               FragmentManager fm = getFragmentManager();
               FragmentTransaction fragmentTransaction = 
               fm.beginTransaction();
               fragmentTransaction.replace(R.id.labelframe, new 
                labelfregaments());
               fragmentTransaction.commit(); 
               count =0;
           }
           else if (count == 0) {



               FragmentManager fm = getFragmentManager();
               labelfregaments fs = (labelfregaments)fm.findFragmentById(R.id.labelframe);
               FragmentTransaction fragmentTransaction = fm.beginTransaction();
               fragmentTransaction.hide(fs);
               fragmentTransaction.commit();


               count=1;

           }