Удалить фрагмент 2 из BackStack и передать данные во фрагмент 1 - PullRequest
0 голосов
/ 02 июня 2019

Внутри моей MainActivity (Demo) я добавляю FragmentDemo 1 в backstack. Внутри этого фрагмента Demo 1 нажатие кнопки открывает новый FragmentDemo 2, где у меня есть текст для редактирования. После нажатия кнопки на этом втором фрагменте я хочу удалить его из backstack и отправить данные из editText обратно в FragmentDemo 1.

Я использую прослушиватель во фрагменте 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 будет удален из backstack и открыт фрагмент 1 с полученными данными из фрагмента 2.

Ответы [ 2 ]

0 голосов
/ 02 июня 2019

Проблема в вашем существующем коде

Контекст, который вы пытаетесь использовать во FragmentDemo2, имеет демонстрационную активность (не FragmentDemo1), поэтому вы не можете набрать приведение к слушателю, когда пытаетесь присоединить

Если вы хотите достичь той же цели с существующим кодом, выполните шаг ниже

1) Expose API из FragmentDemo2, который позволит установить прослушиватель типа Fragment2Callback

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

2) Из FragmentDemo1, когда вы создаете экземпляр FragmentDemo2, вам также необходимо установить себя в качестве прослушивателя FragmentDemo2

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

3) Затем replaceFragment () из FragmentDemo1

4)удалите приведение слушателя из onAttach () внутри FragmentDemo2

Так что теперь у вас есть FragmentDemo1 в качестве слушателя внутри FragmentDemo2, который вы можете использовать для связи с фрагментомDemo1

Надеюсь, эта информация поможет вам

0 голосов
/ 02 июня 2019

Пример фрагмента с обратным стеком.

Ссылка на этот URL https://www.dev2qa.com/android-fragment-back-stack-example/

...