Android 是否可以将值直接从片段传递到自定义视图?

Android 是否可以将值直接从片段传递到自定义视图?,android,Android,FragmentPickFloor.java ...... @Override public void onClick(View v) { switch(v.getId()) { case R.id.btnScan: if(spinFloor.performClick() && spinPartFloor.performClick()) { extras = new Bundle();

FragmentPickFloor.java

......

@Override
public void onClick(View v) {
    switch(v.getId()) {
        case R.id.btnScan:
            if(spinFloor.performClick() && spinPartFloor.performClick()) {
                extras = new Bundle();
                spinFloorValue = spinFloor.getSelectedItem().toString();
                spinPartFloorValue = spinPartFloor.getSelectedItem().toString();
                extras.putString(Constants.FLOOR_KEY, spinFloorValue);
                extras.putString(Constants.FLOOR_PART_KEY, spinPartFloorValue);
                intent = new Intent(getContext(), MainActivity.class);
                intent.putExtras(extras);
                startActivity(intent);

                FragmentCreator.fragmentTransactionSetup(new FragmentFloor(), getFragmentManager(), FragmentFloor.class.getSimpleName());
            }
                break;
    }
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_floor, container, false);
}
FragmentCreator.java

public static void fragmentTransactionSetup(Fragment fragment,
                                            FragmentManager fragmentManager,
                                            String tag) {

    fragmentManager.executePendingTransactions();
    FragmentTransaction fragmentTransaction = fragmentManager
            .beginTransaction();
    fragmentTransaction.replace(R.id.fragment_container, fragment, tag);

    fragmentTransaction.addToBackStack(tag);
    fragmentTransaction.commit();
}
FragmentFloor.java

......

@Override
public void onClick(View v) {
    switch(v.getId()) {
        case R.id.btnScan:
            if(spinFloor.performClick() && spinPartFloor.performClick()) {
                extras = new Bundle();
                spinFloorValue = spinFloor.getSelectedItem().toString();
                spinPartFloorValue = spinPartFloor.getSelectedItem().toString();
                extras.putString(Constants.FLOOR_KEY, spinFloorValue);
                extras.putString(Constants.FLOOR_PART_KEY, spinPartFloorValue);
                intent = new Intent(getContext(), MainActivity.class);
                intent.putExtras(extras);
                startActivity(intent);

                FragmentCreator.fragmentTransactionSetup(new FragmentFloor(), getFragmentManager(), FragmentFloor.class.getSimpleName());
            }
                break;
    }
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_floor, container, false);
}
TouchView.java

public TouchView(Context context, AttributeSet attrs) {
    super(context, attrs);

        extras = ((MainActivity) getContext()).getIntent().getExtras();
        spinFloorValue = extras.getString(Constants.FLOOR_KEY);
        spinPartFloorValue = extras.getString(Constants.FLOOR_PART_KEY);
  }

TouchView在从FragmentPickFloor中的微调器中选择的依赖项值中显示不同的背景。

是。必须使用fragments
setArguments()
方法将捆绑包参数作为参数传递给片段,然后将数据传递给
onCreateView()
中的自定义视图

创建片段时,使用setArguments()方法传递值

然后在你的片段中

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

    touchView.setSpinFloorValue(getArguments().getString(Constants.FLOOR_KEY));
    touchView.setSpinPartFloorValue(getArguments().getString(Constants.FLOOR_PART_KEY));

    return view;
}
或者,您可以尝试使用
getActivity().getIntent()


我使用了您的建议,但是我的值会在自定义视图显示后更新。在这种情况下,您需要一种方法来传播Activity=>Fragment=>custom视图中的值。有几个选项:您可以使用FragmentInteractionListener(如New Fragment Wizard生成的)和事件总线(如Otto或RxJava)。考虑到每个选项所需的时间,研究每个选项并确定哪个最适合您。谢谢。现在我尝试使用LayoutInflater.FactorySolution是一个非常简单的解决方案。我们只需要在自定义视图中创建一个负责逻辑的函数,然后在setters之后调用它,最后使用
touchView.invalidate()