我正在尝试在主要活动的框架布局上实现带有片段的NavigationDrawer。导航抽屉应该在我的“主”片段,GMAP片段和其他片段之间切换。作为“主要”片段,此片段也会在活动首次启动时添加(如您在代码中所见)。问题是,当我点击项目上的片段时,片段被破坏,地图片段再次被创建。我更喜欢片段被创建一次,并以某种方式保存其状态,当我用占位符顶部的其他片段替换它
这是地图片段:
public class SNFFragment extends Fragment {
public SNFFragment() {}
EditText edit1, edit2;
Button btn;
android.widget.TextView TextView;
double value1, value2;
double value3;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.snf_layout, container, false);
edit1 = (EditText) view.findViewById(R.id.edit1);
edit2 = (EditText) view.findViewById(R.id.edit2);
btn = (Button) view.findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (edit1.getText().toString().isEmpty()) {
edit1.setError("Enter value1");
} else if (edit2.getText().toString().isEmpty()) {
edit2.setError("Enter value2");
} else {
calculate();
}
}
});
return view;
}
private void calculate() {
try {
value1 = Double.valueOf(edit1.getText().toString());
value2 = Double.valueOf(edit2.getText().toString());
Log.d("value1", String.valueOf(value1));
Log.d("value2", String.valueOf(value2));
value3 = (0.25 * value1 + value2 * 0.21 + 0.36);
//When the button is clicked, call the calculate method.
TextView.setText(String.format("Answer: %.2f", value3));
} catch (NumberFormatException e) {
Log.d("value1", String.valueOf(value1));
Log.d("value2", String.valueOf(value2));
Log.d("Exception", String.valueOf(e));
}
}
}
}
和主要活动
公共类Main_screen扩展了AppCompatActivity 实现NavigationView.OnNavigationItemSelectedListener {
public class Mapfragment extends Fragment
{
MapView mMapView;
private GoogleMap googleMap;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// inflate and return the layout
View v = inflater.inflate(R.layout.activity_map_fragment, container,
false);
mMapView = (MapView) v.findViewById(R.id.mapView);
mMapView.onCreate(savedInstanceState);
mMapView.onResume();// needed to get the map to display immediately
try {
MapsInitializer.initialize(getActivity().getApplicationContext());
} catch (Exception e) {
e.printStackTrace();
}
Camera camera = UserDetails.getInstance().getCameras().get(0);
googleMap = mMapView.getMap();
// latitude and longitude
double latitude = camera.getLatitude();
double longitude = camera.getLongitude();
// create marker
MarkerOptions marker = new MarkerOptions().position(
new LatLng(latitude, longitude)).title("Hello Maps");
// Changing marker icon
marker.icon(BitmapDescriptorFactory
.defaultMarker(BitmapDescriptorFactory.HUE_ROSE));
// adding marker
googleMap.addMarker(marker);
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(new LatLng(camera.getLatitude(), camera.getLongitude())).zoom(18).build();
googleMap.animateCamera(CameraUpdateFactory
.newCameraPosition(cameraPosition));
// Perform any camera updates here
return v;
}@Override
public void onResume() {
super.onResume();
Log.d("Map fragment Resumed", "sdfsdf");
mMapView.onResume();
}
@Override
public void onPause() {
super.onPause();
Log.d("Map fragment paused","dsffs");
mMapView.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("Map fragment Destroyed", "sdfsdf");
mMapView.onDestroy();
}
@Override
public void onLowMemory() {
super.onLowMemory();
mMapView.onLowMemory();
}
主要的GMAP片段被添加到活动的OnCreate上,服装正在OnItemSelected()上被替换。 非常感谢你!
答案 0 :(得分:0)
如果不应在每个菜单项上更新您的片段,则可以尝试将片段对象存储在Map中,并尝试在菜单项单击事件中检索它。但我不知道这是不是一个好习惯。
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
android.support.v4.app.Fragment fragment = null;
android.support.v4.app.FragmentTransaction fragmentManager = getSupportFragmentManager().beginTransaction();
int id = item.getItemId();
if(myFragmentMap.contains(id) && myFragmentMap.get(new Integer(id))!=null){
fragment=myFragmentMap.get(new Integer(id));
return true;
}
if(myFragmentMap==null)myFragmentMap=new HashMap<>();
if (id == R.id.map_frag_item) {
fragment = new Mapfragment();
myFragmentMap.put(id,fragment);
} else if (id == R.id.nav_gallery) {
} else if (id == R.id.nav_slideshow) {
} else if (id == R.id.nav_manage) {
} else if (id == R.id.nav_share) {
} else if (id == R.id.nav_send) {
}
fragmentManager.replace(R.id.frame_layout_placeholder, fragment).commit();
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
声明myFragmentMap;
您必须将其声明为类变量
public class MyFragment extends Fragment{
static HashMap myFragmentMap;
//onCreateView Method and the rest
}
答案 1 :(得分:0)
在onNavigationItemSelected
中,您每次都会创建新的片段。我想你想做的是:
findFragmentByTag()
。如果它返回null,那么你还没有创建片段
在哪种情况下,您创建新片段,然后添加一些
标签(用于在呼叫时搜索它的标签)
findFragmentByTag()
下次)。
如果确实存在,则可以用。替换当前片段 你找到的那个。
创建片段时,在onCreate方法中,您可能还想调用s etRetainInstance(true)