Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 片段与活动之间的通信_Android_Android Fragments_Android Activity_Interface - Fatal编程技术网

Android 片段与活动之间的通信

Android 片段与活动之间的通信,android,android-fragments,android-activity,interface,Android,Android Fragments,Android Activity,Interface,我有一个带有多个切换按钮的片段。单击“活动”中的某个特定按钮时,我希望将所有这些切换按钮的状态上载到服务器。我看到有一种方法可以做到这一点,正如下面的链接中所解释的,在这里我们创建了一个监听器界面,每次单击每个切换按钮,我们都会更新活动中与每个切换按钮对应的一些标记/整数 但我想知道是否有任何方法可以从活动中了解片段中所有切换按钮的选中/未选中状态,而无需在每次单击切换按钮时实现接口方法。希望我明白了 老实说,实现这一点的最佳方法是使用Android架构组件库中的一个组件。ViewModel可

我有一个带有多个切换按钮的片段。单击“活动”中的某个特定按钮时,我希望将所有这些切换按钮的状态上载到服务器。我看到有一种方法可以做到这一点,正如下面的链接中所解释的,在这里我们创建了一个监听器界面,每次单击每个切换按钮,我们都会更新活动中与每个切换按钮对应的一些标记/整数


但我想知道是否有任何方法可以从活动中了解片段中所有切换按钮的选中/未选中状态,而无需在每次单击切换按钮时实现接口方法。希望我明白了

老实说,实现这一点的最佳方法是使用Android架构组件库中的一个组件。
ViewModel
可以具有每个片段都可以观察到的
observefield
LiveData
值,并且始终具有正确的信息。这也会使您更容易了解生命周期。

下面是一个如何实现这一点的工作示例。活动:

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();
    }
}

甚至可以在活动中调用“toggleFragment.toggleButton1.isChecked()”吗?即使我们将按钮以片段形式公开,我认为这也行不通。我只是验证了一下,但没用。关于你的第二个建议,我如何从活动中调用这个函数。这就是我想要布尔返回的地方我刚刚用一个工作示例编辑了答案,在我的手机上进行了测试。