2017-03-23 39 views
0

フラグメントに問題があります。 > Fragment1では、私が呼んFragment2フラグメント内のテキストボタンを別のフラグメントから設定するには

が - - 。私はボタンにクリックすると> Fragment2では、Fragment1で、ボタンのテキストが変更されます(I私の活動に

私はFragment1

呼び出しますこれは私のソースコードである)

これを行う方法がわからない:

activity_main.xml

<Button 
    android:id="@+id/btnFragment1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="Call Fragment 1" /> 

<LinearLayout 
    android:id="@+id/lnFragment1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"></LinearLayout> 

fragment1.xml:

<Button 
    android:id="@+id/btnFragment2" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="Call Fragment 2" /> 

<LinearLayout 
    android:id="@+id/lnFragment2" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"></LinearLayout> 

fragment2.xml:

<Button 
    android:id="@+id/btnChange" 
    android:layout_width = "match_parent" 
    android:layout_height = "wrap_content" 
    android:text="Change text for button in fragment 1 to 'DONE'" /> 

<LinearLayout 
    android:id="@+id/lnFragment2" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"></LinearLayout> 

MainActivity.java:

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

    Button btnFragment1 = (Button) findViewById(R.id.btnFragment1); 

    btnFragment1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Fragment fragment = new Fragment1(); 
      FragmentManager fragmentManager = getFragmentManager(); 
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); //lay fragmenttransaction thong qua fragment manager 
      fragmentTransaction.replace(R.id.lnFragment1,fragment); 
      fragmentTransaction.commit(); 
     } 
    }); 

} 

Fragment1.java:

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

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

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    Button btnFragment2 = (Button) getView().findViewById(R.id.btnFragment2); 

    btnFragment2.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Fragment fragment = new Fragment2(); 
      FragmentManager fragmentManager = getFragmentManager(); 
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); //lay fragmenttransaction thong qua fragment manager 
      fragmentTransaction.replace(R.id.lnFragment2,fragment); 
      fragmentTransaction.commit(); 
     } 
    }); 
} 

Fragment2.java。

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

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

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    final Button btnChange = (Button) getView().findViewById(R.id.btnChange); 
    btnChange.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Fragment fragment1 = new Fragment1(); 
      View vFragment1 = fragment1.getView(); 
      Button btnChange = (Button) vFragment1.findViewById(R.id.btnChange); 
      btnChange.setText("Done"); 
     } 
    }); 
} 

ありがとうございます!

+3

2つのフラグメントは直接通信する必要はありません、フラグメント1に活動、フラグメント2への活動を通信するインターフェイスを使用してください。 – HaroldSer

+0

あなたは必要です1つのフラグメントを別のフラグメントと通信するには、1つのアクティビティを使用します。 –

答えて

0

契約インタフェースを作成し、それらの間で通信するためのフラグメントで実装します。フラグメントは、このように直接通信することはできません。

0

これを達成するための別の方法は

Framgent -1あなたのFramgent -1

private MyBroadRequestReceiver receiver; 

onCreateView中で

IntentFilter filter = new IntentFilter(ACTION_NAME); 
receiver = new MyBroadRequestReceiver(); 
registerReceiver(receiver, filter); 

パブリッククラスMyBroadRequestReceiverが延びてブロードキャストマネージャーでありますブロadcastReceiver {

@Override 
    public void onReceive(Context context, Intent intent) { 

    //update your Button text here 

    } 


} 

@Override 
    public void onDestroy() { 
     this.unregisterReceiver(receiver); 
     super.onDestroy(); 
    } 

断片-2

とフラグメント-2 から放送あなたが最初のフラグメントボタン

Intent broadcastIntent = new Intent(); 
     broadcastIntent.setAction(ACTION_NAME);  
     sendBroadcast(broadcastIntent); 

のテキストを更新したい永遠に確かにアクション名を作成することを呼び出します両方のフラグメントが同じである必要があります。

+0

ちょうどこれと一緒に行くと、sendBroadCastを呼び出してその意図を取得しながらonReceiveでアクションを実行している間、インテントでいくつかのデータを渡すこともできます。それが有用であると分かった場合は、真であることを忘れていない – 9spl

0

ドンは、あまりにも大きな圧力を受けます。あなたの仕事を楽にするライブラリがあります。 EventBus。あなたもここで良いチュートリアルを見つけることができますFragment Refresh

関連する問題