繁体   English   中英

从BackStack中删除片段2并将数据传递给片段1

[英]Remove Fragment 2 from BackStack and pass data to Fragment 1

在我的MainActivity(演示)中,我将FragmentDemo 1添加到backstack。 在这个fragmentDemo 1中,按下一个按钮会打开一个新的FragmentDemo 2,在那里我有一个编辑文本。 按下第二个片段上的按钮,我想从backstack中删除它,并将editText中的数据发送回FragmentDemo 1。

我在Fragment 2上使用了一个监听器,并实现了这些方法,但是当我运行代码时,我有以下消息。 java.lang.ClassCastException: com.example.teacherapp.activities.Demo@5630fb7must implement Listener

演示(主要活动)

public class Demo extends AppCompatActivity implements FragmentInterface {
private TextView textView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_demo);
    if (savedInstanceState == null) {
        addFragment(new FragmentDemo1());
    }

}

@Override
public void onMyFragment(Fragment fragment) {
    addFragment(fragment);
}

private void addFragment(Fragment fragment){
    getSupportFragmentManager()
            .beginTransaction()
            .add(R.id.demo_container,fragment)
            .addToBackStack(null)
            .commit();
}
}

FragmentInterface

public interface FragmentInterface {
void onMyFragment(Fragment fragment);
}

FragmentDemo 1

public class FragmentDemo1 extends Fragment implements FragmentInterface, FragmentDemo2.Fragment2CallBack {
Button btnFrag1;
TextView tvFrag1;

public FragmentDemo1() {
}

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

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    btnFrag1 = view.findViewById(R.id.fragment1_button);
    tvFrag1 = view.findViewById(R.id.fragment1_tv);
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    FragmentManager fm = getFragmentManager();
    btnFrag1.setText("Frag 1: " + String.valueOf(fm.getBackStackEntryCount()));

    btnFrag1.setOnClickListener(v -> {
        replaceFragment(new FragmentDemo2());
    });
}

@Override
public void onMyFragment(Fragment fragment) {
    replaceFragment(fragment);
}

private void replaceFragment(Fragment fragment) {
    getFragmentManager().
            beginTransaction().
            replace(R.id.demo_container, fragment).
            addToBackStack(null).
            commit();
}

@Override
public void onDataSent(String myData) {
    Toast.makeText(getContext(), "RECEIVED. "+myData, Toast.LENGTH_LONG).show();
}
}

FragmentDemo 2

public class FragmentDemo2 extends Fragment {
private Button btnFrag2;
private EditText etFrag2;
private Fragment2CallBack listener;


public FragmentDemo2(){}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                         @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_fragment_demo2,container,false);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    btnFrag2=view.findViewById(R.id.fragment2_button);
    etFrag2=view.findViewById(R.id.fragment2_et);
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    FragmentManager fm=getFragmentManager();
    btnFrag2.setOnClickListener(v->{
        String info=etFrag2.getText().toString();
        listener.onDataSent(info);
        fm.popBackStack();
    });
}


@Override
public void onAttach(@NonNull Context context) {
    super.onAttach(context);
    try{
        listener=(Fragment2CallBack) context;
    }catch (ClassCastException e){
        throw new ClassCastException(context.toString()+"must implement Listener");

    }
}

public interface Fragment2CallBack{
    void onDataSent(String s);
}

}

预期的结果是从后台堆栈中移除片段2并打开片段1,从片段2接收数据。

片段返回堆栈示例。

请参阅此网址https://www.dev2qa.com/android-fragment-back-stack-example/

现有代码中的问题

您尝试在FragmentDemo2中使用的Context是Demo活动(而不是FragmentDemo1),因此当您尝试附加时,无法将其强制转换为侦听器

如果您想使用现有代码实现相同目标,请按照以下步骤操作

1)从FragmentDemo2中公开API,允许设置Fragment2Callback类型的Listener

public void setListener(Fragment2Callback li) {listener = li;} 

2)从FragmentDemo1开始,当你创建FragmentDemo2实例时,你还需要将自己设置为FragmentDemo2的监听器

FragmentDemo2 frg = new FragemtDemo2()
frg.setListener(this);
replaceFragment(frg);

3)然后从FragmentDemo1中替换Fragment()

4)从FragmentDemo2中的onAttach()中删除监听器的转换

所以现在你在FragmentDemo2里面有FragmentDemo1作为监听器,你可以用它来与fragmentDemo1通信

我希望这些信息对您有所帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM