2016-01-09 3 views
1

Я учусь Fragments и пытаюсь implemen своей собственной задачи, а также следующий эти учебники: developer.androidЗаменить ListFragment с другим фрагментом

Здесь я динамически добавлять ListFragment в контейнер. Затем после нажатия на любой элемент в ListFragment новый EditFragment должен заменить текущий фрагмент в контейнере. Но я получаю исключение IllegalStateException после нажатия на элемент списка. Это потому, что я использую тот же TransactionManager для обоих фрагментов?

Вот мой код:

MyListFragment:

public class MyListFragment extends ListFragment { 

    Communicator communicator; 
    private MenuItem addItem; 
    private MenuItem clearAll; 
    private String name; 

    ArrayList list1 = new ArrayList(); 
    String[] list2 = {"Sunday", "Monday", 
      "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; 
    ArrayAdapter<String> adapter; 
    int randomNum; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     communicator = (Communicator) getActivity(); 
     adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, list1); 
     setListAdapter(adapter); 
     setHasOptionsMenu(true); 
     return super.onCreateView(inflater, container, savedInstanceState); 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     inflater.inflate(R.menu.list_fragment, menu); 

     addItem = menu.findItem(R.id.add_string); 
     clearAll = menu.findItem(R.id.clear); 

     addItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 
      @Override 
      public boolean onMenuItemClick(MenuItem item) { 
       Random rand = new Random(); 
       randomNum = rand.nextInt(list2.length); 
       list1.add(list2[randomNum]); 
       adapter.notifyDataSetChanged(); 
       return true; 
      } 
     }); 

     clearAll.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 
      @Override 
      public boolean onMenuItemClick(MenuItem item) { 
       list1.clear(); 
       adapter.notifyDataSetChanged(); 
       return true; 
      } 
     }); 
    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     communicator.onMyListItemClick(position); 
    } 

    public interface Communicator{ 
     public void onMyListItemClick(int position); 
    } 
} 

MainActivity:

public class MainActivity extends AppCompatActivity implements MyListFragment.Communicator{ 

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

     fragmentManager = getFragmentManager(); 
     fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.add(R.id.fragContainer, new MyListFragment()); 
     fragmentTransaction.commit(); 
    } 

    @Override 
    public void onMyListItemClick(int position) { 
     EditFragment editFragment = new EditFragment(); 

     Bundle args = new Bundle(); 
     args.putInt("position", position); 
     editFragment.setArguments(args); 
     fragmentTransaction.replace(R.id.fragContainer, editFragment); 

     fragmentTransaction.addToBackStack(null); 
     fragmentTransaction.commit(); 
    } 
} 

ответ

2

Проблема заключается не в том, что вы используете один и тот же FragmentManager, а то, что вы пытаетесь для повторного использования FragmentTransaction после вызова commit().

Вам нужно создать новую сделку в onMyListItemClick(), как это:

public void onMyListItemClick(int position) { 
    MainActivityFragment editFragment = new MainActivityFragment(); 

    Bundle args = new Bundle(); 
    args.putInt("position", position); 
    editFragment.setArguments(args); 

    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 
    fragmentTransaction.replace(R.id.fragContainer, editFragment); 

    fragmentTransaction.addToBackStack(null); 
    fragmentTransaction.commit(); 
} 
+0

Отлично, спасибо! Он работает сейчас) Просто addToBackStack по какой-то причине не работает, но я буду работать над этим. – androider

Смежные вопросы