片段切换和生命周期

时间:2016-05-21 11:45:13

标签: android fragment lifecycle

我正在尝试在主要活动的框架布局上实现带有片段的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()上被替换。 非常感谢你!

2 个答案:

答案 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中,您每次都会创建新的片段。我想你想做的是:

  1. 首先检查您是否已有片段。这可以使用 片段管理器上的findFragmentByTag()
  2. 如果它返回null,那么你还没有创建片段 在哪种情况下,您创建新片段,然后添加一些 标签(用于在呼叫时搜索它的标签) findFragmentByTag()下次)。

  3. 如果确实存在,则可以用。替换当前片段 你找到的那个。

  4. 创建片段时,在onCreate方法中,您可能还想调用s etRetainInstance(true)