Showing posts with label Fragment with Map crashes app when back button is pressed or when orientation changes. Show all posts
Showing posts with label Fragment with Map crashes app when back button is pressed or when orientation changes. Show all posts

Wednesday, April 24, 2013

[android help] Fragment with Map crashes app when back button is pressed or when orientation changes


I have an Activity that loads 2 tabs in the ActionBar. Tab 1 loads a Fragment that will will inflate a WebView, while Tab 2 loads a Fragment with a map. Initially, I have the problem of changing tabs that causes the app to crash. I have followed the instructions here and implemented onDestroyView().


The problem now is that if I press the back button from Tab 1 (WebView), it exits the Activity properly. But if I do it on Tab 2 (map), the app crashes. The exact same scenario applies to when I change the orientation. I am convinced that it has something to do with the onDestroyView(), but I am not sure what it is.


I have even attempted to Override the back button, but nothing works.


Here is my code to provide some context:


The Activity Class:



public class MyActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//Displaying the tabs by calling ActionBar
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

//Details Tab
String label1 = getResources().getString(R.string.details);
Tab tab = actionBar.newTab();
tab.setText(label1);
TabListener t1 = new TabListener(this, label1, DetailsFragment.class);
tab.setTabListener(t1);
actionBar.addTab(tab);

//Map Tab
String label2 = getResources().getString(R.string.map);
tab = actionBar.newTab();
tab.setText(label2);
TabListener t2 = new TabListener(this, label2, MapFragment.class);
tab.setTabListener(t2);
actionBar.addTab(tab);
}

private class TabListener implements ActionBar.TabListener {
private Fragment mFragment;
private final Activity mActivity;
private final String mTag;
private final Class mClass;

/**
* Constructor used each time a new tab is created.
*
* @param activity
* The host Activity, used to instantiate the fragment
* @param tag
* The identifier tag for the fragment
* @param clz
* The fragment's Class, used to instantiate the fragment
*/
public TabListener(Activity activity, String tag, Class clz) {
mActivity = activity;
mTag = tag;
mClass = clz;
}

public void onTabSelected(Tab tab, FragmentTransaction ft) {
// Check if the fragment is already initialized
if (mFragment == null) {
// If not, instantiate and add it to the activity
mFragment = Fragment.instantiate(mActivity, mClass.getName());
ft.add(android.R.id.content, mFragment, mTag);
} else {
// If it exists, simply attach it in order to show it
ft.attach(mFragment);

}
}

public void onTabUnselected(Tab tab, FragmentTransaction ft) {
if (mFragment != null) {
// Detach the fragment, because another one is being attached
ft.detach(mFragment);
}
}

public void onTabReselected(Tab tab, FragmentTransaction ft) {
// User selected the already selected tab. Usually do nothing.
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }


DetailsFragment:



public class DetailsFragment extends Fragment {


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

View v = inflater.inflate(R.layout.morning, container, false);
WebView webview = (WebView) v.findViewById(R.id.details);
webview.loadUrl("file:///android_asset/pools/details.html");
return v;
} }


MapFragment:



public class MapFragment extends Fragment {

static final LatLng mapLatLng = new LatLng("some numbers", "some numbers");
private GoogleMap map;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

View v = inflater.inflate(R.layout.map, container, false);
map = ((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();
Marker amksc = map.addMarker(new MarkerOptions().position(mapLatLng).title("Map"));

map.moveCamera(CameraUpdateFactory.newLatLngZoom(mapLatLng, 18));
return v;
}


@Override
public void onDestroyView() {
super.onDestroyView();
MapFragment destroyMe = (MapFragment)getFragmentManager().findFragmentById(R.id.map);
if (destroyMe != null) {
getFragmentManager().beginTransaction().remove(destroyMe).commit();
}
} }


Thanks for reading such a long post. Any help is greatly appreciated. I will be away for awhile without my laptop (15 days to be exact), so I may not be able to respond and test out your answer, but rest assured that I will =)


Thanks in advance!



.

stackoverflow.comm

Google Voice on T-Mobile? [General]

Google Voice on T-Mobile? So I recently switched from a GNex on Verizon to a Moto X DE on T-Mobile. I had always used Google Voice for my v...