1

私のアプリは1つのアクティビティAと2つのフラグメントF1とF2を持っています。インターフェイスを持つ2つのフラグメント間の通信

F1のクリックボタンを1つ押すと、F1がF2に置き換えられます。 F1からF2にデータを転送したいとします。 F2は、ヌルのままにそのため、私はF1にインターフェースを実装しA.

におけるそのメソッドをオーバーライドしかしF2からデータを送信し、私の基準(コードでsFragment)によるれますデータはF2に送信されません。 F1をF2に置き換えながら、TAGを使用してF2への参照を取得しています。

まだ作成していないF2への参照を取得しようとしているようなライフサイクルと関係がありますか?

F1

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

    View v = inflater.inflate(R.layout.form_fragment1,container,false); 
    nextB = (Button) v.findViewById(R.id.f1Next); 
    nextB.setOnClickListener(this); 
    return v; 
} 

@Override 
public void onClick(View view) { 
    switch (view.getId()){ 

     case R.id.f1Next: 
      SFragment fragment = new SFragment(); 
      FragmentManager mManager = getFragmentManager(); 
      FragmentTransaction mTransaction = mManager.beginTransaction(); 
      mTransaction.replace(R.id.fragment_container,fragment,"SecondF"); // SecondF 
      mTransaction.addToBackStack(null); // this is required to move to the previous fragment 
      mTransaction.commit(); 
      commListener.PlaceName(data1,data2); //passing value to activity 
      break; 

    } 

} 
interface CommBridge{ 

    void PlaceName(String data1,String data2); 
} 

@Override 
public void onAttach(Context context){ 
    super.onAttach(context); 
    if (context instanceof CommBridge){ 
     commListener= (CommBridge) context; 
    } 
} 

}

@Override 
public void PlaceName(String data1, String data2) { 
    SFragment sFragment=(SFragment) getFragmentManager().findFragmentByTag("SecondF"); 
    if (sFragment != null && sFragment.isInLayout()){ 
     Log.d("STATE","1"); 
     sFragment.setPlace(data1,data2); 
    }else{ 
     Log.d("STATE","2"); // this is always the case 
    } 

F2

public class SFragment extends Fragment { 
String Place2,Place1; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
    View v = inflater.inflate(R.layout.form_fragment2,container,false); 
    return v; 
} 

void setPlace(String data1, String data2){ 
    place1 = data1; 
    place2 = data2; 

} 
} 
+1

使用すると、1つのフラグメントトンからデータを送信するために 'Bundle'を使用する必要があります別の断片。 – Shailesh

答えて

0

私はあなたの活動のフラグメントを交換するためのコードを置くことをお勧めしますし、直接その引数にSFragment()に渡されるべき値を置く:

SFragment newFragment = new SFragment(); 
Bundle args = new Bundle(); 
args.putString("place1", data1); 
args.putString("place2", data1); 
newFragment.setArguments(args); 

あなたはSFragment#onCreateView()

String place1 = getArguments().getString("place1"); 
でそれらを得ることができます

こちらもご覧ください:https://developer.android.com/training/basics/fragments/communicating.html

+0

これは私の問題Mariusを解決しました。しかし、なぜあなたは私に活動の中に置き換えコードを置くことを勧めましたか?また、避けるべき断片間の直接コミュニケーションのケースではありませんか? –

+0

アクティビティが制御され、そのフラグメントを管理する必要があります。特定のフラグメントは、別のフラグメントがあることを文字通り知らなくてはなりません。その後、フラグメントを置き換えたいときは、コントロールするアクティビティに触れて、すべてのフラグメントを検索する必要がありません。 – noongiya95

+0

私の理解では、直接のコミュニケーションは、あなたが別のフラグメントからフラグメントのメソッドを呼び出そうとする場合にのみ発生します。制御アクティビティに引数を渡すことは、一般的な通信方法です。 – noongiya95

2

フラグメントのonClickイベントの処理をアクティビティに任せます。以下の例を参照してください。

活動:

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 

public class MainActivity extends AppCompatActivity implements Fragment1.CommBridge { 


    private Fragment1 fragment1 = new Fragment1(); 
    private Fragment2 fragment2 = new Fragment2(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     getSupportFragmentManager() 
       .beginTransaction() 
       .replace(R.id.content, fragment1) 
       .commit(); 


    } 

    @Override 
    public void onButtonClicked(String data1, String data2) { 
     fragment2.setData(data1, data2); 
     getSupportFragmentManager() 
       .beginTransaction() 
       .replace(R.id.content, fragment2) 
       .commit(); 
    } 
} 

Fragment1:

import android.content.Context; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 

public class Fragment1 extends Fragment { 

    interface CommBridge { 
     void onButtonClicked(String data1, String data2); 
    } 

    private CommBridge handler; 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     if (context instanceof CommBridge) { 
      handler = (CommBridge) context; 
     } 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment1, container, false); 

     Button button = (Button) view.findViewById(R.id.button); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       handler.onButtonClicked("Data1", "Data2"); 
      } 
     }); 

     return view; 
    } 
} 

Fragment2

import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

public class Fragment2 extends Fragment { 

    private String data1; 
    private String data2; 

    public void setData(String data1, String data2) { 
     this.data1 = data1; 
     this.data2 = data2; 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment2, container, false); 

     TextView textView = (TextView) view.findViewById(R.id.textView); 
     textView.setText(data1 + "\n" + data2); 

     return view; 
    } 
} 
関連する問題