Nuno Malés Nuno Malés - 6 months ago 47
Android Question

error in addView() in change Fragment layout on orientation

I am getting an error in

addView()
. Screen starts in portrait. I change it to landscape and now when I try to switch to portrait, it throws error.

(PORTRAIT Start) -> LANDSCAPE -> (PORTRAIT Exception)

chart ---- https://github.com/PhilJay/MPAndroidChart

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
at android.view.ViewGroup.addViewInner(ViewGroup.java:3784)
at android.view.ViewGroup.addView(ViewGroup.java:3637)
at android.view.ViewGroup.addView(ViewGroup.java:3582)
at android.view.ViewGroup.addView(ViewGroup.java:3558)


Fragment

import android.app.Fragment;

public class EDA_Fragment extends Fragment {

private Chart chart = null;
private View fragmentRootContainer;

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

if(fragmentRootContainer == null) {
fragmentRootContainer = inflater.inflate(R.layout.activity_exam, container, false);

if (chart == null)
chart = new Chart((LineChart) fragmentRootContainer.findViewById(R.id.chart), EDA, 1023f, 1f);

}
return fragmentRootContainer;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setRetainInstance(true);
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);

LayoutInflater inflater = LayoutInflater.from(getActivity());
LinearLayout linearLayout = (LinearLayout) getView();
linearLayout.removeAllViewsInLayout();

// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

fragmentRootContainer = inflater.inflate(R.layout.activity_exam, linearLayout, false);

LineChart lineChart = (LineChart) fragmentRootContainer.findViewById(R.id.chart);
//((ViewGroup)lineChart.getParent()).removeView(lineChart);
lineChart.addView(chart.getChart());


} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){

fragmentRootContainer = inflater.inflate(R.layout.activity_exam, linearLayout, false);

LineChart lineChart = (LineChart) fragmentRootContainer.findViewById(R.id.chart);
//((ViewGroup)lineChart.getParent()).removeView(lineChart);
lineChart.addView(chart.getChart());

}
}
}

Answer

------first--------

add this in AndroidManifest

android:name=".Activity.EDA_Activity"
android:configChanges="orientation"

------second----------

  in layout PORTRAIT add this -> android:orientation="vertical"

  in layout LANDSCAPE add this ->  android:orientation="horizontal"

--------third-----------

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    LayoutInflater inflater = LayoutInflater.from(getActivity());
    LinearLayout linearLayout = (LinearLayout) getView();
    if(linearLayout != null)
        linearLayout.removeAllViewsInLayout();

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

        ViewGroup parentViewGroup = (ViewGroup)chart.getChart().getParent();
        if (parentViewGroup != null)
            parentViewGroup.removeView(chart.getChart());

        fragmentRootContainer = inflater.inflate(R.layout.activity_exam, linearLayout, true);
        LineChart lineChart = (LineChart) fragmentRootContainer.findViewById(R.id.chart);
        lineChart.addView(chart.getChart());
    }
    else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){

        ViewGroup parentViewGroup = (ViewGroup)chart.getChart().getParent();
        if (parentViewGroup != null)
            parentViewGroup.removeView(chart.getChart());

        fragmentRootContainer = inflater.inflate(R.layout.activity_exam, linearLayout, true);
        inflater.inflate(R.layout.activity_exam, linearLayout, false);

        LineChart lineChart = (LineChart) fragmentRootContainer.findViewById(R.id.chart);
        lineChart.addView(chart.getChart());
    }
}