Search code examples
androidandroid-fragmentsandroid-fragmentactivityandroid-listfragmentandroid-lifecycle

getActivity causes the App to crash when called from a Fragment


I am trying to test the screent orientation of the device when using fragment to learn how the lifeCycle of the fragment work. In the code posted below, in the line

int rotation = getActivity().getWindowManager().getDefaultDisplay().getRotation();

is using getActivity() optimal here? if yes, why my app crashes when added it? Please see the Logcat out put posted below.

Java_Code

public class Fragment02 extends Fragment {

private final String TAG = Fragment02.class.getName();
private StringBuilder strBuilder = new StringBuilder("");

OnClickListener btn_00_Listener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

        // TODO Auto-generated method stub
        int rotation = getActivity().getWindowManager().getDefaultDisplay().getRotation();

        Toast mToast;

        switch(rotation) {

        case Surface.ROTATION_0:
            mToast = Toast.makeText(getActivity(), R.string.portrait, Toast.LENGTH_SHORT);
            mToast.setGravity(Gravity.CENTER, 10, 0);
            mToast.show();
            Log.i(TAG, "PORTRAIT");
            break;

        case Surface.ROTATION_90:
            mToast = Toast.makeText(getActivity(), R.string.landscape, Toast.LENGTH_SHORT);
            mToast.setGravity(Gravity.CENTER, 10, 0);
            mToast.show();
            Log.i(TAG, "LANDSCAPE");
            break;

        case Surface.ROTATION_180:
            mToast = Toast.makeText(getActivity(), R.string.reverse_portrait, Toast.LENGTH_SHORT);
            mToast.setGravity(Gravity.CENTER, 10, 0);
            mToast.show();
            Log.i(TAG, "REVERSE_PORTRAIT");
            break;

        case Surface.ROTATION_270:
            mToast = Toast.makeText(getActivity(), R.string.reverse_landscape, Toast.LENGTH_SHORT);
            mToast.setGravity(Gravity.CENTER, 10, 0);
            mToast.show();
            Log.i(TAG, "REVERSE_LANDSCAPE");
            break;

        default:
            Log.i(TAG, "REVERSE_PORTRAIT");
        }// end switch

    }
};

public void onAttach(android.app.Activity activity) {
    strBuilder.append("@onAttached()./n");
    Log.i(TAG, ""+strBuilder);
};

@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

    strBuilder.append("@onCreate()./n");
    Log.i(TAG, ""+strBuilder);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub

    strBuilder.append("@onCreateView()./n");
    Log.i(TAG, ""+strBuilder);

    View v = inflater.inflate(R.layout.activity_screen_orientation_change, container, false);
    Button btn_00 = (Button) v.findViewById(R.id.btn_00);
    btn_00.setOnClickListener(btn_00_Listener);
    return v;
}

LogCat

  10-25 12:52:19.550: E/AndroidRuntime(31627): FATAL EXCEPTION: main
10-25 12:52:19.550: E/AndroidRuntime(31627): Process: com.example.viewpagerwithactiontabstest00, PID: 31627
10-25 12:52:19.550: E/AndroidRuntime(31627): android.support.v4.app.SuperNotCalledException: Fragment Fragment02{4291abe8 #1 id=0x7f080000 android:switcher:2131230720:1} did not call through to super.onAttach()
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.view.View.measure(View.java:17350)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5352)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.view.View.measure(View.java:17350)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5352)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:382)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.view.View.measure(View.java:17350)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5352)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2505)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.view.View.measure(View.java:17350)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2175)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1316)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1513)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1200)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6388)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:803)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.view.Choreographer.doCallbacks(Choreographer.java:603)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.view.Choreographer.doFrame(Choreographer.java:573)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:789)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.os.Handler.handleCallback(Handler.java:733)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.os.Handler.dispatchMessage(Handler.java:95)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.os.Looper.loop(Looper.java:157)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at android.app.ActivityThread.main(ActivityThread.java:5293)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at java.lang.reflect.Method.invokeNative(Native Method)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at java.lang.reflect.Method.invoke(Method.java:515)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
10-25 12:52:19.550: E/AndroidRuntime(31627):    at dalvik.system.NativeStart.main(Native Method)

Solution

    1. You weren't calling the super's onAttach method that's why the error was being thrown.
    2. You forgot the @Override annotation for the onAttach method.
    3. Third, you should just implement the clickListener instead of creating it as a member object.

    Try this:

    public class Fragment02 extends Fragment implements View.OnClickListener {
    
        private final String TAG = "Fragment02";
    
        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            Log.i(TAG, "@onAttach");
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            Log.i(TAG, "@onCreate");
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            Log.i(TAG, "@onCreateView");
            View v = inflater.inflate(R.layout.activity_screen_orientation_change, container, false);
            Button btn_00 = (Button) v.findViewById(R.id.btn_00);
            btn_00.setOnClickListener(this);
    
            return v;
        }
    
        @Override
        public void onClick(View view) {
            int rotation = getActivity().getWindowManager().getDefaultDisplay().getRotation();
    
            Toast mToast;
    
            switch(rotation) {
    
                case Surface.ROTATION_0:
                    mToast = Toast.makeText(getActivity(), R.string.portrait, Toast.LENGTH_SHORT);
                    mToast.setGravity(Gravity.CENTER, 10, 0);
                    mToast.show();
                    Log.i(TAG, "PORTRAIT");
                    break;
    
                case Surface.ROTATION_90:
                    mToast = Toast.makeText(getActivity(), R.string.landscape, Toast.LENGTH_SHORT);
                    mToast.setGravity(Gravity.CENTER, 10, 0);
                    mToast.show();
                    Log.i(TAG, "LANDSCAPE");
                    break;
    
                case Surface.ROTATION_180:
                    mToast = Toast.makeText(getActivity(), R.string.reverse_portrait, Toast.LENGTH_SHORT);
                    mToast.setGravity(Gravity.CENTER, 10, 0);
                    mToast.show();
                    Log.i(TAG, "REVERSE_PORTRAIT");
                    break;
    
                case Surface.ROTATION_270:
                    mToast = Toast.makeText(getActivity(), R.string.reverse_landscape, Toast.LENGTH_SHORT);
                    mToast.setGravity(Gravity.CENTER, 10, 0);
                    mToast.show();
                    Log.i(TAG, "REVERSE_LANDSCAPE");
                    break;
    
                default:
                    Log.i(TAG, "REVERSE_PORTRAIT");
            }// end switch
        }
    }