2014-01-27 3 views
2

Я пытаюсь сделать очень простой пример с фрагментами.Передача данных между двумя фрагментами в двух разных действиях

Структура: Фрагмент1 -> Фрагмент1Активность, фрагмент2 -> Фрагмент2Активность.

В обоих действиях есть СТАТИЧЕСКИЙ Фрагмент.

Вот XMLs:

activity_for_fragment_1.xml

<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/fragment_1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:name="com.xx.fragmentstutorial1.Fragment1" 
    tools:context="com.xx.fragmentstutorial1.Fragment1Activity"/> 

fragment1.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/textview_fragment_1" 
     android:layout_width="match_parent" 
     android:layout_height="0dip" 
     android:layout_weight="0.60" 
     android:text="This is Fragment 1" 
     android:gravity="center" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <EditText 
     android:id="@+id/edittext_fragment_1_text" 
     android:layout_width="match_parent" 
     android:layout_height="0dip" 
     android:layout_weight="0.20" 
     android:text="Type your message here..." > 

     <requestFocus /> 
    </EditText> 

    <Button 
     android:id="@+id/button_fragment_1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Click Me" /> 

</LinearLayout> 

activity_for_fragment_2.xml

<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/fragment_2" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:name="com.xx.fragmentstutorial1.Fragment2" 
    tools:context="com.xx.fragmentstutorial1.Fragment2Activity"/> 

fragment_2.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/textview_fragment_2" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:text="This is Fragment 2" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <TextView 
     android:id="@+id/textview_fragment_2_result" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="center" 
     android:text="I will display text from \nFragment 1" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

</LinearLayout> 

Теперь у меня есть Edittext и кнопка в фрагменте_1. Когда я нажимаю на кнопку, я хочу получить текст, введенный в EditText, и установить его в textview(textview_fragment_2_result) в фрагменте_2

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

Fragment1Activity.java

public class Fragment1Activity extends SherlockFragmentActivity implements Fragment1.ButtonClickListener{ 

    Fragment1 fragment1; 

    @Override 
    protected void onCreate(Bundle bundle) { 
     super.onCreate(bundle); 
     setContentView(R.layout.activity_for_fragment_1); 
     System.out.println("onCreate Fragment1Activity"); 
     fragment1 = (Fragment1) getSupportFragmentManager().findFragmentById(R.id.fragment_1); 

    } 

    @Override 
    public void onButtonClick(String message) { 
     System.out.println("onButtonClick Fragment1Activity"); 
     startActivity(new Intent(this, Fragment2Activity.class).putExtra("message", message)); 
    } 

} 

Fragment1.java

public class Fragment1 extends SherlockFragment { 

    EditText message; 
    Button clickme; 

    ButtonClickListener listener; 

    public interface ButtonClickListener{ 
     public void onButtonClick(String message); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 

     if (activity instanceof ButtonClickListener) 
      listener = (ButtonClickListener) activity; 
     else { 

     } 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     System.out.println("onCreateView Fragment1"); 

     View view = inflater.inflate(R.layout.fragment_1, container, false); 

     message = (EditText) view.findViewById(R.id.edittext_fragment_1_text); 
     clickme = (Button) view.findViewById(R.id.button_fragment_1); 
     clickme.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       if (!message.getText().toString().equalsIgnoreCase("")) { 
        System.out.println("Message in Fragment1 = "+message.getText().toString()); 

        listener.onButtonClick(message.getText().toString()); 
       } else { 
        Toast.makeText(getActivity(), 
          "Please enter some message...", Toast.LENGTH_LONG) 
          .show(); 
       } 

      } 
     }); 

     return view; 
    } 

} 

Fragment2Activity.java

public class Fragment2Activity extends SherlockFragmentActivity { 

    Fragment2 fragment2; 

    @Override 
    protected void onCreate(Bundle bundle) { 
     super.onCreate(bundle); 
     setContentView(R.layout.activity_for_fragment_2); 

     fragment2 = (Fragment2) getSupportFragmentManager().findFragmentById(R.id.fragment_2); 
     fragment2.setMessage(getIntent().getExtras().getString("message").toString()); 
    } 

} 

Fragment2.java

public class Fragment2 extends SherlockFragment { 

    String msg; 
    TextView textview; 

    public Fragment2() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_2, container, false); 
     textview = (TextView) view 
       .findViewById(R.id.textview_fragment_2_result); 
     textview.setText(msg); 
     return view; 
    } 

    public void setMessage(String message) { 
     msg = message; 
     textview.setText(msg); 
    } 
} 

Я установил текст для textview в setMessage() из Fragment2.java, который, я думаю, не является хорошим подходом. Если я прокомментирую это, я не вижу никакого текста в текстовом фрагменте Fragment2.

Может кто-то помочь мне, как правильно передать значения между двумя статическими фрагментами.

+0

то, что вы сделали, - это один подход, который используют люди, или же сохранить значение в общей привилегии и получить его из второго фрагмента после запуска активности так же, как вы hve –

ответ

0

Вы должны идти с interface

Следуйте Диаграмму здесь:

Связь между двумя фрагмента осуществляется через операцию с использованием интерфейса

Fragment ------------ -------------->Activity -------------------- Fragment B

(определяет Interface) (Реализация interface) (передать другой фрагмент B)

Надеется, что это может помочь

Check This Out

+0

Это не то, что я хочу .. FragmentA -> Активность A -> Активность B -> Fragment B, это то, что я ищу .. –

0

Что вы имеете в основном хорошо. Часть передачи данных из Fragment1 в Activity1 хороша. Как только данные попадут в Activity2, вы установите его в Fragment2. Я немного изменил бы эту часть.

В деятельности2:

@Override 
protected void onCreate(Bundle bundle) { 
    super.onCreate(bundle); 
    setContentView(R.layout.activity_for_fragment_2); 

    fragment2 = (Fragment2) getSupportFragmentManager().findFragmentById(R.id.fragment_2); 
    fragment2.setArguments(getIntent().getExtras()); 
} 

и в FRAGMENT2.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    Bundle bundle = getArguments(); 
    String message = bundle.getString("message"); 
    View view = inflater.inflate(R.layout.fragment_2, container, false); 
    textview = (TextView) view 
      .findViewById(R.id.textview_fragment_2_result); 
    textview.setText(message); 
    return view; 
} 
0

Ваш подход кажется правильным. Соединение между вашим Fragment1 и Activity1 аналогично фрагментам guideline. Ваш фрагмент1 не должен знать о фрагменте2, поэтому вполне нормально передать ответственность за контейнер/родительский элемент1 фрагмента - который знает, что делать с данными. На этот раз ваш подход правильный - activity1 запускает его подчиненный/дочерний и т. Д. И несет ответственность за то, чтобы запустить его с правильными данными (прошедшими через дополнительные намерения). И снова у вас есть правильный подход - когда ваша активность2 создается, вы заполняете ее представления соответствующим контентом/данными (сообщением), которые должны были отображаться в этом действии и предоставляться ему «родительским» действием.

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