我一直在尝试构建一个Android应用程序,以便了解片段背后的基本概念。但我完全无法显示和隐藏片段。
这是我的onClickListner代码
final FragmentManager fragmentManager = getFragmentManager();
b.setOnClickListener(new View.OnClickListener() {
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void onClick(View v) {
FragmentTransaction ft = fragmentManager.beginTransaction();
PM_Fragment pm_fragment = new PM_Fragment();
ft.replace(android.R.id.content, pm_fragment);
if (pm_fragment.isHidden()) {
fragmentManager.beginTransaction()
.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out)
.show(pm_fragment)
.commit();
b.setText("Hide");
} else {
fragmentManager.beginTransaction()
.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out)
.hide(pm_fragment)
.commit();
b.setText("Show");
}
}
});
在我的案例中,片段只是一个文本行。按钮应该做的是切换片段的可见性。
谁能告诉我这段代码有什么问题?
如果不工作,我的意思是按钮在点击时什么都不做,除了从"隐藏"到"显示"然后它会保持"显示",无论你点击它多少次。而这个过程对片段的行为完全没有影响。
答案 0 :(得分:1)
我真的不明白你在这里要做什么,但你永远不会提交ft
所以你的Fragment
永远不会被添加到Activity
。我也不明白两个内在FragmentTransaction
的目的,但是除了说你完全不需要
全球定义:
private PM_Fragment pmFragment = new PM_Fragment();
您的OnClickListener
应如下所示:
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
if(pmFragment.isAdded()) {
ft.remove(pmFragment);
} else {
ft.replace(android.R.id.content, pmFragment);
}
ft.commit();
}
});
重要:要使FragmentTransactions
生效,必须在代码中添加Fragment
!如果您以XML格式添加它们,那么它们就不会受FragmentTransactions
的影响!因此,如果像这样添加Fragment
:
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="at.example.fragments.SomeFragment" />
或者使用其他类似的方法,我确信这至少是问题的一部分。您需要仅在以下代码中添加Fragment
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
SomeFragment fragment = SomeFragment.newInstance();
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.flFragmentContainer, fragment);
transaction.commit();
}
}
只需在布局中将<fragment />
标记替换为以下内容:
<FrameLayout
android:id="@+id/flFragmentContainer"
android:layout_width="match_parent"
android:layout_height="match_parent" />
它将作为您要添加的Fragment
的容器。您可以使用上面的FragmentTransaction
将Fragment
添加到此FrameLayout
。