【问题标题】:getActivity causes the App to crash when called from a FragmentgetActivity 在从 Fragment 调用时导致应用程序崩溃
【发布时间】:2014-10-25 10:55:00
【问题描述】:

我正在尝试在使用fragment 时测试设备的屏幕方向,以了解fragment 的生命周期如何工作。在下面发布的代码中,在

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

在这里使用getActivity() 是最优的吗?如果是,为什么我的应用在添加时会崩溃?请参阅下面发布的Logcat 输出。

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)

【问题讨论】:

  • onAttach() 在代码中缺少super.anAttach() 调用。
  • @S.D.谢谢您的回答。但我有两个问题要问您:1-您是如何从logcat 得知问题出在onAttach 的? 2-为什么当我自动生成 onAttch 时,eclipse 不包含 super 方法并且将 activit 的实例传递给它,这导致应用程序无法运行。但是在添加super 方法并传递一个捆绑包后,它可以工作
  • @S.D. 1onAttach`知道看起来像这样public void onAttach(Activity savedInstanceState) { // TODO Auto-generated method stub super.onAttach(savedInstanceState);

标签: android android-fragments android-fragmentactivity android-listfragment android-lifecycle


【解决方案1】:
  1. 您没有调用 super 的 onAttach 方法,这就是引发错误的原因。
  2. 您忘记了 onAttach 方法的 @Override 注释。
  3. 第三,您应该只实现 clickListener 而不是将其创建为成员对象。

试试这个:

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
    }
}

【讨论】:

  • 感谢您的回答。请让我知道为什么onattach 回调应该像你所说的那样,因为我现在如下并且它可以工作public void onAttach(Activity savedInstanceState) { // TODO Auto-generated method stub super.onAttach(savedInstanceState);
  • 另一个问题,实现 onclicklistener 和创建它作为成员有什么区别?
  • @LetsAmrIt @Override 是一个很好的做法。如果 super 没有这样的方法,它会警告你。实现使代码看起来更干净。您也可以在 onCreateView 中创建一个监听器作为匿名类,然后使用它。不知道为什么要像在代码中那样实例化它。
  • 请您看看这个问题stackoverflow.com/questions/26562013/…,如果您不介意,请支持我的问题
猜你喜欢
  • 1970-01-01
  • 2016-08-27
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 2015-10-21
  • 2016-06-04
相关资源
最近更新 更多