gpt4 book ai didi

android - FragmentTransaction 什么都不做

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:23:37 25 4
gpt4 key购买 nike

我正在学习 fragment ,下面给出的是我的第一个 fragment 程序。一个简单的项目,我有 2 个屏幕。当我单击第一个屏幕的下一步按钮时,需要显示第二个按钮。

enter image description here

我的目标是 Android 2.1 及更高版本并且使用兼容包

AppMainFragmentActivity.java

public class AppMainFragmentActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
setContentView(R.layout.app_main_layout);
}
}

app_main_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" android:id="@+id/fragment_container">

<fragment class="com.research.fragmentstudy.FirstFragment"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/id_first_fragment"/>

</LinearLayout>

FirstFragment.java

public class FirstFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.first_fragment_layout
, container,false);

Button nextButton =(Button) view.findViewById(R.id.button);
nextButton.setOnClickListener(nextListener);
return view;
}

private OnClickListener nextListener = new OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fm = ((AppMainFragmentActivity)FirstFragment.this
.getActivity()).getSupportFragmentManager();
SecondFragment fragment = new SecondFragment();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.fragment_container, fragment);
ft.commit();
}
};
}

first_fragment_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" android:id="@+id/first_fragment_root">

<TextView android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="Fragment 1" android:gravity="center_horizontal" />

<Button android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content" android:id="@+id/button"
android:text="Next" />

</LinearLayout>

第二个 fragment .java

public class SecondFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.second_fragment_layout,
container,false);
return view;
}
}

second_fragment_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" android:id="@+id/first_fragment_root">

<TextView android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="Fragment 2" android:gravity="center_horizontal" />

</LinearLayout>

好吧,我的第一个屏幕没问题。现在,

根据我对 fragment 的理解,我的预期

  • 当我在屏幕 1 中单击“下一步”按钮时,将创建 SecondFragment,它的 onCreate()onCreateView() 被调用。
  • SecondFragment 被显示,FirstFragment 被销毁(因为我不将其添加到 backstack 中)。以后不会出动画了默认 fragment 事务没有动画。

发生了什么

  • SecondFragment 正在正确创建,它的 onCreate()onCreateView() 被调用。
  • 但 FirstFragment 仍然在屏幕上,而第二个从未显示。

现在我对 fragment 的理解可能是错误的。但我相信当我们 commit() 一个 fragment 事务时,第一个 fragment 应该被第二个 fragment 替换(第一个 fragment 要么被隐藏或被破坏)。好吧,似乎什么都没有发生。这是为什么?我们应该手动销毁/隐藏第一个 fragment 吗?

注意:我知道对于这样一个基本的东西来说这是一个很长的问题。但是我把我的整个代码都放了,因为我不确定我在哪里搞砸了。

最佳答案

好吧,我让它工作了。这个问题的两个答案都正确地说明了我的代码无法按预期工作的原因之一。但是我的代码中有 2 个错误。

使用 fragmentTransaction.add() 不会在旧 fragment 上显示新 fragment 。你需要调用 replace()。给出的答案是正确的。

但是我的代码中还有一个错误。您不能替换在 xml 中静态创建的 fragment 。所以我改变了

app_main_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" android:id="@+id/fragment_container">

</LinearLayout>

AppMainFragmentActivity.java

public class AppMainFragmentActivity extends FragmentActivity {

@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
setContentView(R.layout.app_main_layout);

FragmentManager fragmentManager = getSupportFragmentManager();
FirstFragment fragment = new FirstFragment();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.fragment_container,fragment);
fragmentTransaction.commit();
}
}

关于android - FragmentTransaction 什么都不做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12418060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com