Как получить значение от дочернего фрагмента к родительскому?

Я расстроен.
Я хочу получить значение от дочернего фрагмента к родительскому фрагменту. Я пробовал много методов.
Интерфейс, ViewModel, общие настройки, но никто не работает.

Я следовал этому методу

но у меня это не работает.
здесь мой родительский фрагмент кода:

public class Chart_Fragment extends Fragment
implements Product_Fragment.pf_interface {
String dt;
TextView tv;


public Chart_Fragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View v = inflater.inflate(R.layout.chart_fragment, container, false);

    // create product_fragment as childfragment
    FragmentManager fm = getChildFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    Product_Fragment product_fragment = new Product_Fragment();
    ft.replace(R.id.fl_two, new Product_Fragment());
    ft.commit();

    return v;
}

public void onViewCreated(View v, Bundle savedInstanceState){
    super.onViewCreated(v,savedInstanceState);
    tv = (TextView)v.findViewById(R.id.rcv);
}

@Override
public void data(String d) {
    FragmentManager fragmentManager = getChildFragmentManager();
    Product_Fragment product_fragment = 
    (Product_Fragment)fragmentManager.findFragmentByTag("data");

    if(product_fragment != null){
        String dt = d;
        tv.setText(dt);
        }
   }
}

и мой дочерний фрагмент:

public class Product_Fragment extends Fragment {
private pf_interface pf;

public Product_Fragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View v = inflater.inflate(R.layout.product_fragment, container, false);

    Button b = (Button)v.findViewById(R.id.btn_sender);
    b.setOnClickListener(new btnClick());

    return v;
}

public void onAttachToParentFragment(Fragment fragment){
    try {
        pf = (pf_interface)fragment;
    }catch (ClassCastException e){
        throw new ClassCastException(
                fragment.toString()+ "must implement pf_interface"
        );
    }
}

public void onCreate(Bundle savedInstanceState){
    Log.i(TAG, "onCreate");
    super.onCreate(savedInstanceState);

    onAttachToParentFragment(getParentFragment());
}


private class btnClick implements View.OnClickListener{

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_sender:
                if(pf != null){
                    pf.data("button click interface");
                }break;
        }

    }
}

public interface pf_interface{
    void data(String d);
}

}

текстовое представление родительского фрагмента не отображало строку d («интерфейс нажатия кнопки») из дочернего фрагмента


person irabeka    schedule 17.10.2018    source источник


Ответы (1)


Почему вы проверяете дочерний фрагмент в обратном вызове вашего родительского фрагмента?

@Override
public void data(String d) {
    FragmentManager fragmentManager = getChildFragmentManager();
    Product_Fragment product_fragment = 
    (Product_Fragment)fragmentManager.findFragmentByTag("data");

    if(product_fragment != null){ // Why to check for child fragment nullability?
        String dt = d;
        tv.setText(dt);
    }
 }

Вы можете напрямую использовать вот так:

@Override
public void data(String d) {
    tv.setText(d);
}

Примечание. в любом конкретном сценарии, если какой-либо из объектов имеет значение null, ваш обратный вызов не будет выполнен. Вы уже проверили нулевую ссылку.

person Jeel Vankhede    schedule 17.10.2018
comment
Я пробовал, но все еще не работал. Существует ошибка java.lang.NullPointerException в pf.data (интерфейс нажатия кнопки); - person irabeka; 19.10.2018