2013-07-10 3 views
0

Есть ли способ назначить Bundle фрагменту, уже созданному ?. Я пробовал что-то вроде этого:Связывание во фрагменте, создаваемом

Bundle mArgumentos = new Bundle(); 
mArgumentos.putString("id", id); 
this.setArguments(mArgumentos); 

Но я получаю сообщение об ошибке: Фрагмент уже активен.

Мне просто интересно, могу ли я достичь этого без переопределения метода onBackPressed().

Моя цель в том, что у меня есть форма для регистрации нового элемента. Отсюда я могу перейти к другому фрагменту (назовем его фрагментом_B) новым идентификатором элемента (я вызываю фрагмент_B с комплектом, назначающим новый идентификатор). Когда пользователь нажимает кнопку «Назад», он переходит к предыдущей форме, но идентификатор отсутствует (это связано с тем, что форма переходит в предыдущее состояние, например, пустая), поэтому, если он снова попытается перейти к фрагменту_B, он не может использовать этот идентификатор.

Очевидно, пользователь не может перейти к фрагменту_B, если форма не была сохранена. Таким образом, пользователь сохраняет форму, а затем нажмите кнопку, чтобы перейти к fragment_B с новым идентификатором:

FragmentB fragment = new FragmentB(); 

Bundle mArgumentos = new Bundle(); 
mArgumentos.putString("id",id); 

fragment.setArguments(mArgumentos); 

FragmentManager manager = getSupportFragmentManager(); 
FragmentTransaction ft = manager.beginTransaction(); 

ft.replace(android.R.id.tabcontent, fragment, tag); 
ft.addToBackStack(tag); 
ft.commit(); 

Все предложения ?.

Edit: enter image description here

Фрагменты не в одной и той же деятельности. Когда я создаю новый элемент и нажимаю кнопку «Сохранить», я должен быть в «режиме редактирования». Это означает, что после создания элемента я могу вернуться и отредактировать его. Я просто использую тот же фрагмент для редактирования и создания. Поэтому, когда я создаю элемент, нажмите кнопку, чтобы перейти к фрагменту_B, а затем нажмите кнопку «Назад», я должен быть «режимом редактирования» этого элемента. Это означает, что от фрагмента_B до предыдущего я должен передать идентификатор созданного элемента. Вот почему я хочу знать, могу ли я сделать это без переопределения метода onBackpress.

Edit2:

Если нет другого пути для достижения этой цели, я мыслил переопределить метод onBackpress так:

//get the fragment where I'm staying on. 
Fragment fragmentActual = this.getSupportFragmentManager().findFragmentById(android.R.id.tabcontent); 

//get the tag of the fragment 
String fragmentTag = fragmentActual.getTag().toString(); 

if (fragmentTag.equals("tagFragmentB")){ 
    Fragment fragmentA = new FragmentA(); 

Bundle mArguments = fragmentActual.getArguments(); 
String id = mArguments.getString("id"); 

    if(id != null){ 

     fragmentA .setArguments(mArguments); 

     FragmentManager manager = getSupportFragmentManager(); 
     FragmentTransaction ft = manager.beginTransaction(); 

     ft.replace(android.R.id.tabcontent, fragment, "fragmentA"); 
     ft.addToBackStack("fragmentA"); 
     ft.commit(); 
    } 

}else{ 
    super.onBackPressed(); 
} 

Это работает, но у вас есть уведомление, это изменить порядок фрагментов, вызванных пользователем, и это должно быть невидимым для пользователя. Таким образом, это заставляет меня вводить больше кода, чтобы получить вызовы, которые пользователь сделал.

Я вроде как новый, так что, возможно, у меня нет «мышления Android». Если есть лучший способ сделать то, что я хочу, я открыт для всего. Я просто хочу правильно подумать и не буду иметь проблем в будущем только потому, что пользователь нажал кнопку «Назад».

+0

Вы не предоставили полный комплект деталей о том, что вы делаете так (например, те фрагменты, в одной и той же деятельности): * Есть в любом случае присвоить Bundle к фрагмент уже создан? * - нет. Прежде всего, должен ли пользователь вернуться к форме? У вас есть форма для регистрации нового элемента, и вы передаете это другому фрагменту с идентификатором. Но если вы вернетесь к форме, это не форма, которая должна создать новый элемент (так почему нужно перейти к фрагменту b со старым идентификатором)? И после того, как вы попадете в форму (из фрагмента b), как вы снова переходите к фрагменту b? – Luksprog

+0

Followup: Если вы выполните те же действия, что и при создании нового элемента, вы не совсем поняли это. Если вы разрешите форме редактировать вновь созданный фрагмент b на обратной кнопке, нажмите фрагмент формы, чтобы увидеть новый фрагмент и извлечь его данные без необходимости использования явного идентификатора. После того, как вы разобрались с этим, я хотел бы, чтобы фрагменты обменивались информацией с родительской активностью (и передавали идентификатор между ними) и позволяли ей сортировать хранилище идентификаторов и использовать их. – Luksprog

+0

привет Luksprog спасибо за помощь снова;). Я только что редактировал мой вопрос. – kiduxa

ответ

0

Ну, в моей конкретной ситуации я сделал это, сделав следующее: я заметил, что когда я заполняю форму, ее сохранил, а затем перейдите к фрагменту и, наконец, нажмите кнопку «Назад», информация о моей форме была сохранена. Так что я положил скрытый etidText в моей форме:

<EditText 
    android:id="@+id/textEditHiddenId" 
    android:visibility="gone" 
    android:inputType="number" /> 

Когда кнопка сохранения нажата, я установить содержание этого EditText:

etIdHidden.setText(id); 

Когда активность создается, согласно http://developer.android.com/guide/components/fragments.html, метод onResume вызывается после onCreateView.Таким образом, я получаю значение моего textEditHiddenId в этом методе:

@Override 
public void onResume() { 
    super.onResume(); 
    String id= etIdHidden.getText().toString(); 

    if(id.equals("")==false){ 
     mArgumentos=new Bundle(); 
     mArgumentos.putString("id", ""+id); 

    } 

}; 

В первый раз, содержание textEditHiddenId пуст, но когда BackButton нажимается и метод onResume называется, я получаю содержание инициализируется и я может переопределить мой Bundle.

решение

Простейшее никогда ..

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