试图让我的片段替换我的其他片段

时间:2014-06-13 20:13:21

标签: android android-fragments replace

public class MainActivity extends Activity {
private Fragment fragment;
private Button btn1, btn2, btn3;
private Fragment newFragment;


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

    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();

    StartFragment myFragment = new StartFragment();
    ft.add(R.id.myFragment, myFragment);
    ft.commit();

    buttonsPressed();

}

private void buttonsPressed() {
    // TODO Auto-generated method stub
    btn1 = (Button)findViewById(R.id.button1);
    btn1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            newFragment = new Fragment();
            Log.i("Button1", "Pressed");
        }
    });
    btn2 = (Button)findViewById(R.id.button2);
    btn2.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            newFragment= new Fragment2();
        }
    });
    btn3 = (Button)findViewById(R.id.button3);
    btn3.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            newFragment = new Fragment3();
        }
    });

    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.myFragment, newFragment);
    transaction.commit();


}

}

所以我在网上关注教程创建片段。现在我走了,试着看看自己能做些什么。请记住,我是android编程新手。我的按钮工作正常,但我的最后一段代码完全打破了应用程序。我知道我的按钮可以做logcat测试。当我把这段代码放在transaction.replace(R.id.myFragment,newFragment)时,不幸的是它已经停止了。我离开了吗?

Logcat错误

06-13 02:22:30.184: E/AndroidRuntime(21154): FATAL EXCEPTION: main
06-13 02:22:30.184: E/AndroidRuntime(21154): Process: com.example.transitionfragments, PID: 21154
06-13 02:22:30.184: E/AndroidRuntime(21154): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.transitionfragments/com.example.transitionfragments.MainActivity}: java.lang.NullPointerException
06-13 02:22:30.184: E/AndroidRuntime(21154):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2413)
06-13 02:22:30.184: E/AndroidRuntime(21154):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471)
06-13 02:22:30.184: E/AndroidRuntime(21154):    at android.app.ActivityThread.access$900(ActivityThread.java:175)
06-13 02:22:30.184: E/AndroidRuntime(21154):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
06-13 02:22:30.184: E/AndroidRuntime(21154):    at android.os.Handler.dispatchMessage(Handler.java:102)
06-13 02:22:30.184: E/AndroidRuntime(21154):    at android.os.Looper.loop(Looper.java:146)
06-13 02:22:30.184: E/AndroidRuntime(21154):    at android.app.ActivityThread.main(ActivityThread.java:5602)
06-13 02:22:30.184: E/AndroidRuntime(21154):    at java.lang.reflect.Method.invokeNative(Native Method)
06-13 02:22:30.184: E/AndroidRuntime(21154):    at java.lang.reflect.Method.invoke(Method.java:515)
06-13 02:22:30.184: E/AndroidRuntime(21154):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
06-13 02:22:30.184: E/AndroidRuntime(21154):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
06-13 02:22:30.184: E/AndroidRuntime(21154):    at dalvik.system.NativeStart.main(Native Method)
06-13 02:22:30.184: E/AndroidRuntime(21154): Caused by: java.lang.NullPointerException
06-13 02:22:30.184: E/AndroidRuntime(21154):    at android.app.BackStackRecord.doAddOp(BackStackRecord.java:395)
06-13 02:22:30.184: E/AndroidRuntime(21154):    at android.app.BackStackRecord.replace(BackStackRecord.java:430)
06-13 02:22:30.184: E/AndroidRuntime(21154):    at android.app.BackStackRecord.replace(BackStackRecord.java:422)
06-13 02:22:30.184: E/AndroidRuntime(21154):    at com.example.transitionfragments.MainActivity.buttonsPressed(MainActivity.java:85)
06-13 02:22:30.184: E/AndroidRuntime(21154):    at com.example.transitionfragments.MainActivity.onCreate(MainActivity.java:40)
06-13 02:22:30.184: E/AndroidRuntime(21154):    at android.app.Activity.performCreate(Activity.java:5451)
06-13 02:22:30.184: E/AndroidRuntime(21154):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
06-13 02:22:30.184: E/AndroidRuntime(21154):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2377)
06-13 02:22:30.184: E/AndroidRuntime(21154):    ... 11 more
06-13 02:24:31.813: E/AndroidRuntime(21362): FATAL EXCEPTION: main
06-13 02:24:31.813: E/AndroidRuntime(21362): Process: com.example.transitionfragments, PID: 21362
06-13 02:24:31.813: E/AndroidRuntime(21362): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.transitionfragments/com.example.transitionfragments.MainActivity}: java.lang.NullPointerException
06-13 02:24:31.813: E/AndroidRuntime(21362):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2413)
06-13 02:24:31.813: E/AndroidRuntime(21362):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471)
06-13 02:24:31.813: E/AndroidRuntime(21362):    at android.app.ActivityThread.access$900(ActivityThread.java:175)
06-13 02:24:31.813: E/AndroidRuntime(21362):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
06-13 02:24:31.813: E/AndroidRuntime(21362):    at android.os.Handler.dispatchMessage(Handler.java:102)
06-13 02:24:31.813: E/AndroidRuntime(21362):    at android.os.Looper.loop(Looper.java:146)
06-13 02:24:31.813: E/AndroidRuntime(21362):    at android.app.ActivityThread.main(ActivityThread.java:5602)
06-13 02:24:31.813: E/AndroidRuntime(21362):    at java.lang.reflect.Method.invokeNative(Native Method)
06-13 02:24:31.813: E/AndroidRuntime(21362):    at java.lang.reflect.Method.invoke(Method.java:515)
06-13 02:24:31.813: E/AndroidRuntime(21362):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
06-13 02:24:31.813: E/AndroidRuntime(21362):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
06-13 02:24:31.813: E/AndroidRuntime(21362):    at dalvik.system.NativeStart.main(Native Method)
06-13 02:24:31.813: E/AndroidRuntime(21362): Caused by: java.lang.NullPointerException
06-13 02:24:31.813: E/AndroidRuntime(21362):    at android.app.BackStackRecord.doAddOp(BackStackRecord.java:395)
06-13 02:24:31.813: E/AndroidRuntime(21362):    at android.app.BackStackRecord.add(BackStackRecord.java:385)
06-13 02:24:31.813: E/AndroidRuntime(21362):    at com.example.transitionfragments.MainActivity.buttonsPressed(MainActivity.java:84)
06-13 02:24:31.813: E/AndroidRuntime(21362):    at com.example.transitionfragments.MainActivity.onCreate(MainActivity.java:40)
06-13 02:24:31.813: E/AndroidRuntime(21362):    at android.app.Activity.performCreate(Activity.java:5451)
06-13 02:24:31.813: E/AndroidRuntime(21362):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
06-13 02:24:31.813: E/AndroidRuntime(21362):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2377)
06-13 02:24:31.813: E/AndroidRuntime(21362):    ... 11 more
06-13 02:24:46.177: E/AndroidRuntime(21475): FATAL EXCEPTION: main
06-13 02:24:46.177: E/AndroidRuntime(21475): Process: com.example.transitionfragments, PID: 21475
06-13 02:24:46.177: E/AndroidRuntime(21475): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.transitionfragments/com.example.transitionfragments.MainActivity}: java.lang.NullPointerException
06-13 02:24:46.177: E/AndroidRuntime(21475):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2413)
06-13 02:24:46.177: E/AndroidRuntime(21475):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471)
06-13 02:24:46.177: E/AndroidRuntime(21475):    at android.app.ActivityThread.access$900(ActivityThread.java:175)
06-13 02:24:46.177: E/AndroidRuntime(21475):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
06-13 02:24:46.177: E/AndroidRuntime(21475):    at android.os.Handler.dispatchMessage(Handler.java:102)
06-13 02:24:46.177: E/AndroidRuntime(21475):    at android.os.Looper.loop(Looper.java:146)
06-13 02:24:46.177: E/AndroidRuntime(21475):    at android.app.ActivityThread.main(ActivityThread.java:5602)
06-13 02:24:46.177: E/AndroidRuntime(21475):    at java.lang.reflect.Method.invokeNative(Native Method)
06-13 02:24:46.177: E/AndroidRuntime(21475):    at java.lang.reflect.Method.invoke(Method.java:515)
06-13 02:24:46.177: E/AndroidRuntime(21475):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
06-13 02:24:46.177: E/AndroidRuntime(21475):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
06-13 02:24:46.177: E/AndroidRuntime(21475):    at dalvik.system.NativeStart.main(Native Method)
06-13 02:24:46.177: E/AndroidRuntime(21475): Caused by: java.lang.NullPointerException
06-13 02:24:46.177: E/AndroidRuntime(21475):    at android.app.BackStackRecord.doAddOp(BackStackRecord.java:395)
06-13 02:24:46.177: E/AndroidRuntime(21475):    at android.app.BackStackRecord.add(BackStackRecord.java:385)
06-13 02:24:46.177: E/AndroidRuntime(21475):    at com.example.transitionfragments.MainActivity.buttonsPressed(MainActivity.java:84)
06-13 02:24:46.177: E/AndroidRuntime(21475):    at com.example.transitionfragments.MainActivity.onCreate(MainActivity.java:40)
06-13 02:24:46.177: E/AndroidRuntime(21475):    at android.app.Activity.performCreate(Activity.java:5451)
06-13 02:24:46.177: E/AndroidRuntime(21475):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
06-13 02:24:46.177: E/AndroidRuntime(21475):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2377)
06-13 02:24:46.177: E/AndroidRuntime(21475):    ... 11 more

1 个答案:

答案 0 :(得分:2)

代码的顺序存在问题。

您无法在该位置执行交易(buttonsPressed方法),因为newFragment未初始化(null),并在您点击任何按钮时初始化。

我建议你做这个修改:

private void buttonsPressed() {
    // TODO Auto-generated method stub
    btn1 = (Button)findViewById(R.id.button1);
    btn1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            newFragment = new Fragment();
            changeFragment(); // Change the fragment now
            Log.i("Button1", "Pressed");
        }
    });

    btn2 = (Button)findViewById(R.id.button2);
    btn2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            newFragment= new Fragment2();
            changeFragment(); // Change the fragment now
        }
    });

    btn3 = (Button)findViewById(R.id.button3);
    btn3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           // TODO Auto-generated method stub
            newFragment = new Fragment3();
            changeFragment(); // Change the fragment now
        }
    });
}

// Method to replace the fragment after initializing newFragment variable
protected void changeFragment() {
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.myFragment, newFragment);
    transaction.commit();
}