Android 片段显示/隐藏根本不起作用
为了理解片段背后的基本概念,我一直在尝试构建一个android应用程序。但我完全无法显示和隐藏片段Android 片段显示/隐藏根本不起作用,android,android-fragments,Android,Android Fragments,为了理解片段背后的基本概念,我一直在尝试构建一个android应用程序。但我完全无法显示和隐藏片段这是我的onClickListner代码 final FragmentManager fragmentManager = getFragmentManager(); b.setOnClickListener(new View.OnClickListener() { @TargetApi(Build.VERSION_CODES.HONEYCOMB) public void onCl
这是我的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");
}
}
});
在我的例子中,Fragment只是一个文本行。按钮的作用是切换片段的可见性。
有人能告诉我这个代码有什么问题吗?我所说的不工作,是指当点击按钮时,除了将其文本从“隐藏”更改为“显示”之外,它什么也不做,并且在这之后,无论你点击多少次,它都会保持“显示”。这个过程对片段的行为没有任何影响。我真的不明白你在这里想做什么,但是你从来没有提交过
ft
,所以你的片段从来没有添加到活动中。我也不明白两个内部片段事务的目的,但可以说您根本不需要它们
在全球范围内定义:
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();
}
});
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="at.example.fragments.SomeFragment" />
@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();
}
}
重要信息:要使片段事务
正常工作,必须在代码中添加片段
!如果在XML中添加它们,则它们不会受到碎片事务的影响!因此,如果像这样添加您的片段
:
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();
}
});
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="at.example.fragments.SomeFragment" />
@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();
}
}
只需在布局中将
标记替换为如下内容:
<FrameLayout
android:id="@+id/flFragmentContainer"
android:layout_width="match_parent"
android:layout_height="match_parent" />
它将用作要添加的片段的容器。您可以使用上面的FragmentTransaction
将Fragment
添加到此FrameLayout
我已经编辑了问题,请查看是否有帮助。从您现有的答案来看,您似乎正在向活动添加一个片段。但那部分对我来说很好。我需要在按下按钮时切换可见性。帮助您理解我正在尝试执行的操作。为什么要执行此操作?看起来有点奇怪。为什么不添加和删除片段
?按钮只是一个触发器,以后可以用任何其他类型的触发器来概括它。在我看来,显示/隐藏片段是一个常见的场景。在添加/删除与显示/隐藏中,有什么权衡?