0

私は断片について学んでいます。私は、ボタンのクリックに基づいてデータを自分のアクティビティに戻すためにフラグメントからインターフェイスを作成するという答えに続き、完全に動作します。Java - アクティビティからデータをフラグメントに渡す

すべての作成後、自分のアクティビティと同じように、自分のアクティビティの特定の変更をリスニングする方法は分かりません。

基本的に私のアクティビティにはボタンがあり、フラグメントには別のボタンがあります。私のアクティビティでボタンをクリックすると、フラグメントが私のフラグメントボタンのテキストを変更することを知るように、いくつかのデータを送信したいと思います。ここで

が私の現在のフラグメント

public void onClickBtn1(View v) { 
    passData("abc"); 
} 

public interface OnDataPass { 
    void onDataPass(String data); 
} 

OnDataPass dataPasser; 

@Override 
public void onAttach(Context a) { 
    super.onAttach(a); 
    dataPasser = (OnDataPass) a; 
} 

public void passData(String data) { 
    dataPasser.onDataPass(data); 
} 

してから、この私の活動の

@Override 
public void onDataPass(String data) { 
    //do something with data 
} 

だ私は何とかこのまったく同じことを取得したいのですが、フリップフロップ。助言がありますか?ありがとう!

+0

他の方法でも簡単です。フラグメントトランザクションを作成しているときにフラグメントへの参照を保持し、 'myFragment.passData(" anything ")'のようなものを言い、断片の中に通常のメソッドを作ります。 – Vucko

+0

@Pamあなたのコードの2行目の誤字。する必要があります:passData( "abc"); – padeg

答えて

0

基本的には、インタフェースを使用してバンドルを使用したり、私の知る限りインタフェースを使用した二つの方法でこれを行うことができますが follow this question its already answered

+0

さて、私はそれを何度も何度も何度も読んでいます。問題は、新しいデータをonCreateに送信することです。私のフラグメントは既に作成されており、変更するのを待っているだけです – Pam

1

を断片化する活動からのデータを渡すのより良い方法であるあなたは、この

を行う必要があります
public class MainFragment extends Fragment implements MainActivity.OnDataPassedListener { 

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

    @Override 
    public void onDataPassed(String text) { 
     Log.d("text",text); 
    } 
} 

とあなたの活動の

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     MainFragment mainFragment = new MainFragment(); 
     mainFragment.onDataPassed("xx"); 
    } 

    public interface OnDataPassedListener { 
     void onDataPassed(String text); 
    } 
} 

私はそれをテストし、それがidでフラグメントに活動の同じインスタンスを取得することによって、これを試してみてください

+0

は機能しません。私はフリップフロップをあなたのやり方に似たものにしようとしました。しかし、私がMainActivity.OnDataPassedListenerを実装するときには、 "循環的継承..."というメッセージが表示されます。 onDataPassedListenerも私には未知のクラスです – Pam

+0

もう一度私の答えをチェック@Pam –

0

を働いている: - あなたは

Button actBtn = (Button) getActivity().findViewById(R.id.activityButton); 

その後のsetText()またはのgetText()など同じ操作。 そして、あなたは断片からMainActivity(すべての活動)へのアクセス(関数、またはデータ(配列リスト)を)したい場合は、アクティビティのインスタンスを使用する必要があります:

MainActivity mainActivity = (MainActivity) getActivity(); 

その後のように呼び出す更新

任意のメソッドへのmainActivity.performOperation()。

+0

これは悪い考えではありません。 getActivity()がフラグメント内で使用されていますが、私のMainActivityからフラグメントにあるボタンを呼び出す方法はありますか?ありがとう! – Pam

+0

@Pamフラグメントからアクティビティに値を渡したいのですが、そうですか? –

+0

@Pam 1つはインターフェイスで、もう1つは上記のように2つの方法があります。 –

関連する問題