2014-07-02 83 views
0

我有3个片段和3个按钮,当我单击一个按钮时,它会更改片段,但是当我单击片段列表上的某个项目时,会打开一个新的片段。已添加片段

public class MainActivity extends FragmentActivity implements ContactFragment.OnContactClickedListener{ 
private CalendarFragment calendarFragment; 
private CommunicationFragment communicationFragment; 
private ContactFragment contactFragment; 
private SingleContactFragment singleContactFragment; 
// 
private FragmentManager manager; 
// 
private Button btn_calendar, btn_contact, btn_communication; 

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

    manager = getSupportFragmentManager(); 
    manager.beginTransaction() 
      .add(R.id.fl_main_container, calendarFragment).commit(); 
} 

private void bind() { 
    btn_calendar = (Button) findViewById(R.id.btn_main_calendar); 
    btn_communication = (Button) findViewById(R.id.btn_main_communication); 
    btn_contact = (Button) findViewById(R.id.btn_main_contact); 
    btn_calendar.setOnClickListener(listener); 
    btn_communication.setOnClickListener(listener); 
    btn_contact.setOnClickListener(listener); 
} 

private void initFragments() { 
    calendarFragment = new CalendarFragment(); 
    communicationFragment = new CommunicationFragment(); 
    contactFragment = new ContactFragment(); 
    singleContactFragment = new SingleContactFragment(); 
} 

private void changeFragment(Fragment f) { 
    manager.beginTransaction().replace(R.id.fl_main_container, f).commit(); 
    manager.executePendingTransactions(); 
} 
private void displayContact(ContactObject contact){ 
    manager.beginTransaction().replace(R.id.fl_main_container, singleContactFragment).addToBackStack(null).commit(); 
    manager.executePendingTransactions(); 
} 
private OnClickListener listener = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     switch (v.getId()) { 
     case R.id.btn_main_calendar: 
      changeFragment(calendarFragment); 
      break; 
     case R.id.btn_main_communication: 
      changeFragment(communicationFragment); 
      break; 
     case R.id.btn_main_contact: 
      changeFragment(contactFragment); 
      break; 
     } 
    } 
}; 

@Override 
public void onClick(ContactObject contact) { 
    // TODO Auto-generated method stub 
    displayContact(contact); 
} 
} 

当我点击联系,我选择一个联系人,我再次点击联系人,然后我开始挖掘在我的背上按钮,一个“IllegalStateException异常;已添加片段:ContactFragment”被抛出。我不明白为什么。

这里的logcat的:

07-02 13:32:31.046: E/AndroidRuntime(11412): FATAL EXCEPTION: main 
07-02 13:32:31.046: E/AndroidRuntime(11412): java.lang.IllegalStateException: Fragment already added: ContactFragment{420b6a40 #0 id=0x7f060000} 
07-02 13:32:31.046: E/AndroidRuntime(11412): at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1192) 
07-02 13:32:31.046: E/AndroidRuntime(11412): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:646) 
07-02 13:32:31.046: E/AndroidRuntime(11412): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484) 
07-02 13:32:31.046: E/AndroidRuntime(11412): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:482) 
07-02 13:32:31.046: E/AndroidRuntime(11412): at com.big5media.ercoiffure.MainActivity.changeFragment(MainActivity.java:57) 
07-02 13:32:31.046: E/AndroidRuntime(11412): at com.big5media.ercoiffure.MainActivity.access$1(MainActivity.java:55) 
07-02 13:32:31.046: E/AndroidRuntime(11412): at com.big5media.ercoiffure.MainActivity$1.onClick(MainActivity.java:79) 
07-02 13:32:31.046: E/AndroidRuntime(11412): at android.view.View.performClick(View.java:4240) 
07-02 13:32:31.046: E/AndroidRuntime(11412): at android.view.View$PerformClick.run(View.java:17721) 
07-02 13:32:31.046: E/AndroidRuntime(11412): at android.os.Handler.handleCallback(Handler.java:730) 
07-02 13:32:31.046: E/AndroidRuntime(11412): at android.os.Handler.dispatchMessage(Handler.java:92) 
07-02 13:32:31.046: E/AndroidRuntime(11412): at android.os.Looper.loop(Looper.java:137) 
07-02 13:32:31.046: E/AndroidRuntime(11412): at android.app.ActivityThread.main(ActivityThread.java:5103) 
07-02 13:32:31.046: E/AndroidRuntime(11412): at java.lang.reflect.Method.invokeNative(Native Method) 
07-02 13:32:31.046: E/AndroidRuntime(11412): at java.lang.reflect.Method.invoke(Method.java:525) 
07-02 13:32:31.046: E/AndroidRuntime(11412): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
07-02 13:32:31.046: E/AndroidRuntime(11412): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
07-02 13:32:31.046: E/AndroidRuntime(11412): at dalvik.system.NativeStart.main(Native Method) 
+0

您可以提供logcat输出吗? – Premsuraj

+0

好的,我刚刚编辑过它。 – Tsunaze

回答

0

在您changeFragment方法尝试addToBackStack(空)追加如果您不需要导航回......否则,你应该更好地删除片段,然后重新添加。

manager.beginTransaction().replace(R.id.fl_main_container, f).addToBackStack(null).commit(); 
+0

但addToBackStack方法在这里要记住的操作,所以当我backpress我回到之前的状态,而不是退出应用程序。但我不想记住。 – Tsunaze

+0

这就是为什么你将它添加为空。你有没有尝试过? – yahya