我有一个Activity
,有多个Fragments
。
在一个片段(A)中,我打电话给另一个片段(B),当我完成时,我点击这个片段(B)上的一个按钮,然后我回到另一个片段(A)。
问题是,在这个片段(A)中我有按钮,但是当我从片段(B)返回时再次点击它时,它们不起作用。
相反,它们在片段(B)中执行一个函数,即使我们在片段(A)中。
片段(A)中的@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.nextMessage:
System.out.println("NextMessage - Start");
game();
System.out.println("NextMessage - End");
break;
case R.id.playersList:
System.out.println("PlayersList - Start");
lookUpPlayers();
System.out.println("PlayersList - End");
break;
default:
break;
}
}
片段(B)中的@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.backToGame:
provider.getFragmentSwitcher().back();
System.out.println("Back executed.");
break;
default:
System.out.println("Default executed.");
break;
}
}
当我从(B)回到Fragment(A)时,(A)中的所有按钮都执行(B)中的witcher的默认值! 所以输出是:"默认执行。"
为什么?
这是back()方法:
public void back(){
fragmentManager.popBackStackImmediate();
}
这是什么原因......奇怪的问题?为什么片段A在片段B中执行方法?
如果你想要一个跑步或外观,这里是GitHub项目!
答案 0 :(得分:1)
我刚刚为您构建了测试应用程序。 我将在这里分享。
activity_main.xml中
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
MainAcitivty.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentA fragmentA = new FragmentA();
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.container, fragmentA)
.commit();
} }
layout_fragment_a.xml
<FrameLayout 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:id="@+id/fragment_mainLayout"
tools:context="com.nikolay.fragmentmanagertest.FragmentA">
<!-- TODO: Update blank fragment layout -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginTop="20dp"
android:textColor="@android:color/black"
android:textSize="32sp"
android:layout_centerHorizontal="true"
android:text="FragmentA"/>
<Button
android:id="@+id/next_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Next"
android:textSize="18sp"
android:layout_centerInParent="true"/>
</RelativeLayout>
</FrameLayout>
FragmentA.java
public class FragmentA extends Fragment {
private Button nextBtn;
public FragmentA() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.fragment_layout_a, container, false);
nextBtn = (Button)rootView.findViewById(R.id.next_btn);
nextBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FragmentB fragmentB = new FragmentB();
getChildFragmentManager().beginTransaction().replace(R.id.fragment_mainLayout, fragmentB).addToBackStack(null).commit();
}
});
return rootView;
}
}
layout_fragment_b.xml
<FrameLayout 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:id="@+id/fragment_mainLayout"
android:background="@android:color/white"
android:clickable="true"
tools:context="com.nikolay.fragmentmanagertest.FragmentB">
<!-- TODO: Update blank fragment layout -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginTop="20dp"
android:textColor="@android:color/black"
android:textSize="32sp"
android:layout_centerHorizontal="true"
android:text="FragmentB"/>
<Button
android:id="@+id/back_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Back"
android:textSize="18sp"
android:layout_centerInParent="true"/>
</RelativeLayout>
</FrameLayout>
FragmentB.java
public class FragmentB extends Fragment {
private Button backButton;
public FragmentB() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.fragment_layout_b, container, false);
backButton = (Button) rootView.findViewById(R.id.back_btn);
backButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getParentFragment().getChildFragmentManager().popBackStackImmediate();
}
});
return rootView;
}
}
我已经测试了这个代码。我认为它可以按你的意愿运作。
请尝试使用此功能,然后让我知道结果。 我希望这对你有好处。
尼古拉