【问题标题】:How to controls the views in a fragment from another fragment with an interface如何通过接口控制另一个片段中的片段中的视图
【发布时间】:2019-01-10 18:14:20
【问题描述】:

我正在构建一个表情包生成器应用。它有2 fragments

第一个片段在下面有2 TextViewsan ImageView
第二个片段有2 EditTexts2 Buttons

第一个可点击片段中的 ImageView 有一个占位符图像。

1- 如果未选择其他图像,我想将第二个片段中提到的视图的可见性更改为 gone

2- 我想通过检查可绘制文件的名称来做到这一点。

我被告知我应该为此使用接口。

如何使用界面下单?

这是我在同一个应用程序中使用的界面示例。我想知道该怎么做。

public class BottomControlsFragment extends Fragment {

    EditText topEditText, bottomEditText;
    Button btnCreate, btnReset;

    BottomControlsListener activityCommander;

    public interface BottomControlsListener{ void createMeme(String top, String bottom);}

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        try{activityCommander = (BottomControlsListener) context;}

        catch (ClassCastException e){throw new ClassCastException(context.toString());}
    }

public class MainActivity extends AppCompatActivity implements BottomControlsFragment.BottomControlsListener{

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

    @Override
    public void createMeme(String top, String bottom) {
        TopImageFragment topImageFragment = (TopImageFragment)getSupportFragmentManager().findFragmentById(R.id.fragment1);
        topImageFragment.setMemeText(top, bottom);
    }
}

public class TopImageFragment extends Fragment {

    ...

    public void setMemeText(String top, String bottom){
        topTextView.setText(top);
        bottomTextView.setText(bottom);
    }

    ...

}

【问题讨论】:

  • 这些片段是否同时可见?还是用第一个替换第二个?
  • 它们同时可见。一个是 ImageView 持有者,另一个是为 Image 添加标题的 EditTexts 和 Buttons。

标签: android android-fragments fragment communication


【解决方案1】:

你应该使用LocalBroadCast或者viewModel,不要接口回调通信,当fragment manager要独立启动fragment时会出问题

  1. 制作广播接收器以更改 2st frag 中的可见性
  2. 通过LocalBroadcastManager实例在onResume中注册广播接收器,在onPause中注销
  3. notChanged 通过LocalBroadcastManager 实例在第二个片段onResume 中发送带有注册操作的意图时,检查第一个片段中的差异图像。如需更多信息,请在 Google 上查看示例

更新:如果你想使用接口,Here is a complete tutorial

【讨论】:

  • @OnurOzbek 我已将描述添加到 anwer
  • 我要求演示。
【解决方案2】:

好吧,正如谷歌文档所说:

片段之间通信的推荐方式是创建一个共享的 ViewModel 对象。两个片段都可以通过其包含的 Activity 访问 ViewModel。 Fragments 可以更新 ViewModel 中的数据,如果数据是使用 LiveData 暴露的,那么只要它正在观察 ViewModel 中的 LiveData,新的状态就会被推送到另一个 Fragment。要了解如何实现这种通信,请阅读 ViewModel 指南中的“在片段之间共享数据”部分。

我建议你也这样做。它是如何完成的。

首先,您需要创建您的 viewModel:

public class SharedViewModel extends ViewModel {
private final MutableLiveData<Item> selected = new MutableLiveData<Item>();

public void select(Item item) {
    selected.setValue(item);
}

public LiveData<Item> getSelected() {
    return selected;
}
}

之后,您可以在两个片段中使用它:

public class FirstFragment extends Fragment {
    private SharedViewModel model;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        itemSelector.setOnClickListener(item -> {
            model.select(item);
        });
    }
}


public class SecondFragment extends Fragment {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        model.getSelected().observe(this, { item ->
           // Update the UI.
        });
    }
}

使用起来毫不费力。如果您有任何问题,请告诉我。

【讨论】:

  • 问题不是在真空中“在 2 个片段之间进行通信”。如何控制另一个片段中的视图?我在 YouTube 上观看的示例都是关于将文本从一个片段发送到另一个片段。我想知道在其他片段中控制视图背后的策略。
猜你喜欢
  • 2019-03-12
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多