【问题标题】:Communicating between Fragment and Activity在 Fragment 和 Activity 之间进行通信
【发布时间】:2017-10-05 19:25:59
【问题描述】:

我有一个带有多个切换按钮的片段。在我的活动中单击特定按钮时,我想将所有这些切换按钮的状态上传到服务器。我看到有一种方法可以按照以下链接中的说明进行操作,在该链接中,我们创建了一个侦听器界面,并且在每次单击每个切换按钮时,我们都会更新与每个切换按钮相对应的活动中的一些标记/整数。

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

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

【问题讨论】:

    标签: android android-fragments android-activity interface


    【解决方案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();
        }
    }
    

    【讨论】:

    • 是否可以在活动中调用“toggleFragment.toggleButton1.isChecked()”?即使我们在片段中公开按钮,我认为这也行不通。我刚刚验证过,没有用。我是否遗漏了您从活动中实例化 toggleFragment 的方式
    • 关于你的第二个建议,我如何从活动中调用这个函数。这就是我想要返回布尔值的地方
    • 我刚刚用一个工作示例编辑了答案,并在我的手机上进行了测试。
    【解决方案2】:

    老实说,实现此目的的最佳方法是使用 Android 架构组件库中的 ViewModelViewModel 可以有一个 ObservableFieldLiveData 值,每个 Fragment 都可以观察到,并且始终具有正确的信息。这也可以更容易地感知生命周期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多