2017-10-05 15 views
1

複数のトグルボタンを持つフラグメントがあります。アクティビティ内の特定のボタンをクリックすると、これらのトグルボタンのステータスをすべてサーバーにアップロードします。以下のリンクで説明するように、リスナーインターフェースを作成し、各トグルボタンのクリックごとに、各トグルボタンに対応するアクティビティのタグ/整数をいくつか更新します。フラグメントとアクティビティの間の通信

https://developer.android.com/training/basics/fragments/communicating.html

しかし、私はトグルボタンがクリックされるたびに、インターフェイスメソッドを実装せず活動からのフラグメント内のすべてのトグルボタンの確認/未チェックの状態を知るためにどのような方法があるかどうかを知りたいです。私ははっきりしていると思う。

答えて

1

これを実現するための実例があります。アクティビティ:

public class MainActivity extends AppCompatActivity { 
    ToggleFragment toggleFragment; 
    Button updateStatusButton; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main_activity); 

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

     toggleFragment = ToggleFragment.newInstance(); 

     getSupportFragmentManager().beginTransaction() 
            .replace(R.id.main_frame, toggleFragment, "ToggleFragment") 
            .commit(); 

     updateStatusButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       boolean buttonsChecked = toggleFragment.areToggleButtonsChecked(); 

       Toast.makeText(MainActivity.this, String.format("Toggle buttons checked: %s", buttonsChecked), Toast.LENGTH_LONG).show(); 
      } 
     }); 
    } 
} 

とフラグメント:

public class ToggleFragment extends Fragment { 
    ToggleButton toggleButton1; 
    ToggleButton toggleButton2; 
    ToggleButton toggleButton3; 

    public static ToggleFragment newInstance() { 
     Bundle args = new Bundle(); 
     ToggleFragment fragment = new ToggleFragment(); 

     fragment.setArguments(args); 

     return fragment; 
    } 

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

     toggleButton1 = (ToggleButton) view.findViewById(R.id.toggleButton1); 
     toggleButton2 = (ToggleButton) view.findViewById(R.id.toggleButton2); 
     toggleButton3 = (ToggleButton) view.findViewById(R.id.toggleButton3); 

     return view; 
    } 

    public boolean areToggleButtonsChecked() { 
     return toggleButton1.isChecked() 
       && toggleButton2.isChecked() 
       && toggleButton3.isChecked(); 
    } 
} 
+0

は、 "toggleFragment.toggleButton1.isChecked()" の活動に呼び出すことさえ可能ですか?ボタンを断片的に公開しても、私はこれがうまくいくとは思わない。私はちょうど確認し、それは動作しませんでした。どのようにインスタンス化しているのか分からなくなっていますか? –

+0

2つ目の提案に関して、この関数をアクティビティから呼び出す方法を教えてください。それは返されたブール値が返される場所です –

+0

私は実際の例を使って答えを編集し、私の電話でそれをテストしました。 – Tharkius

0

あなたがこれを達成できる最善の方法は、Android Architecture ComponentsライブラリのViewModelです。 ViewModelは、各フラグメントが観測でき、常に正しい情報を持つObservableFieldまたはLiveDataの値を持つことができます。これにより、ライフサイクルに対応しやすくなります。

関連する問題