大家好我正在研究我的MainActivity,我正在处理以下问题:
在我的MainActivity中,我有3个按钮(button1,button2,button3)。每个我都可以在我的容器中添加Fragment(Fragment2, Fragment1, ProfileFragment)
。每次按下按钮时,如果已经有另一个可见,它会检查碎片。
如果是,FragmentManager().beginnTransaction().fragment.hide()
应隐藏它。
然后检查绑定到按钮的片段是否已存在。
如果不是,则添加它。
如果是,则应使用FragmentManager().beginnTransaction().fragment.show()
现在:如果我在启动应用程序时按button2
作为第一个,一切正常,我可以在片段之间无限切换。
但是:如果我按button1
作为第一个,然后切换到button2
或button3
,则片段绑定到button1
({{1} }}无法再次显示。它只显示m2fragment
(当我按m1fragment
时应该隐藏它)
如果我按下按钮3作为第一个,也会发生同样的情况。每当我尝试切换回button1
(button3
)时,它只显示m1fragment。
googleMap可能存在问题,我从profileFragment
的xml调用了吗?
任何人都可以看到我犯了哪些(a)错误?我很高兴,因为我现在正处理这个问题好几天了。
谢谢大家!
从我的MainActivity剪切:
m2Fragment
mProfileFragment和m2Fragment同样使用onCreate和onCreateView方法:
public class MainActivity extends FragmentActivity implements ProfileFragment.OnFragmentInteractionListener,
OfferFragment.OnFragmentInteractionListener, MapsFragment.OnFragmentInteractionListener, OpenerFragment.OnFragmentInteractionListener, GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
private GoogleApiClient mGoogleApiClient;
protected int fragment1Open = 0;
protected int fragment2Open = 0;
protected int profileFragmentOpen = 0;
Fragment1 m1Fragment = new Fragment1();
Fragment2 m2Fragment = new Fragment2();
ProfileFragment mProfileFragment = new ProfileFragment();
OpenerFragment mOpenerFragment = new OpenerFragment();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState==null) {
getFragmentManager().beginTransaction().add(R.id.container,mOpenerFragment).commit();
}
final Button button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//check fragments
if(mOpenerFragment.isVisible()) {
getFragmentManager().beginTransaction().remove(mOpenerFragment).commit();
Log.d("button1", "remove OpenerFragment");
}
if(m1Fragment.isVisible()) {
getFragmentManager().beginTransaction().hide(m1Fragment).commit();
}
if(mProfileFragment.isVisible()) {
getFragmentManager().beginTransaction().hide(mProfileFragment).commit();
}
if(fragment2Open==0) {
fragment2Open=1;
getFragmentManager().beginTransaction().add(R.id.container, m2Fragment).commit();
} else {
getFragmentManager().beginTransaction().show(m2Fragment).commit();
}
}
});
final Button button2 = (Button) findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//hide other fragments
if(mOpenerFragment.isVisible()) {
getFragmentManager().beginTransaction().remove(mOpenerFragment).commit();
}
if(mProfileFragment.isVisible()) {
getFragmentManager().beginTransaction().hide(mProfileFragment).commit();
}
if(m2Fragment.isVisible()) {
getFragmentManager().beginTransaction().hide(m2Fragment).commit();
}
if(fragment1Open==0) {
fragment1Open=1;
getFragmentManager().beginTransaction().add(R.id.container, m1Fragment).commit();
} else {
getFragmentManager().beginTransaction().show(m1Fragment).commit();
}
}
});
final Button button3 = (Button) findViewById(R.id.button3);
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//hide other fragments
if(mOpenerFragment.isVisible()) {
getFragmentManager().beginTransaction().remove(mOpenerFragment).commit();
}
if(m1Fragment.isVisible()) {
getFragmentManager().beginTransaction().hide(m1Fragment).commit();
}
if(m2Fragment.isVisible()) {
getFragmentManager().beginTransaction().hide(m2Fragment).commit();
}
//open fragment
if(profileFragmentOpen==0) {
profileFragmentOpen=1;
getFragmentManager().beginTransaction().add(R.id.container, mProfileFragment).commit();
} else {
getFragmentManager().beginTransaction().show(mProfileFragment).commit();
}
}
});
m1Fragment具有相同的方法,但从其xml文件中获取googleMaps片段。
m1Fragment:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootview = inflater.inflate(R.layout.fragment_profile, container, false);
return rootview;
}
fragment_1.xml:
public class Fragment1 extends Fragment implements OnMapReadyCallback {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MapFragment mapFragment=(MapFragment) getFragmentManager().findFragmentById(mapid);
if (mapFragment==null) {
mapFragment = MapFragment.newInstance();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.container, mapFragment);
fragmentTransaction.commit();
mapFragment.getMapAsync(this);
}
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap map) {
//right upper corner, location layer activated
map.setMyLocationEnabled(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_maps, container, false);
return rootView;
}
答案 0 :(得分:1)
MapFragment mapFragment=(MapFragment) getFragmentManager().findFragmentById(mapid);
在这一行中您实际上要获取父级的fragmentManager(在您的情况下是活动),并且无法找到该片段。 然后在这一行:
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.container, mapFragment);
fragmentTransaction.commit();
您要添加到父FragmentManager。
快速解决方案是用getChildFragmentManager替换getFragmentManger(),它引用片段的FragmentManager。
答案 1 :(得分:0)
也许你应该尝试使用:
// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack if needed
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
在您的活动中将fragment_container
作为FrameLayout吗?
我不是百分百肯定,但我认为它会避免此类问题
答案 2 :(得分:0)
我刚刚解决了它:
在我的div
课程中,我实例化了一个googleMaps片段"两次"。试图隐藏MapsFragment
我只隐藏了其中一个,让另一个可见在前面。
对于在此处遇到类似问题的人,我的解决方案: 我删除了
mapFragment
来自xml布局文件。
在<fragment
android:id="@id/mapid"
class="com.google.android.gms.maps.MapFragment"/>
课程内我改变了
MapsFragment
到
MapFragment mapFragment=(MapFragment) getChildFragmentManager().findFragmentById(mapid);
现在我将一个干净的MapFragment实例放入我的FrameLayout中,它可以正常工作。