如何从孩子碎片到父母碎片获得价值?

时间:2018-10-17 09:38:14

标签: android android-fragments android-nested-fragment

我很沮丧。
我想从子片段到父片段获取价值 我尝试了很多方法。
界面,viewModel,sharedpreferences,但没有一项可用。

I had follow this method

但这对我不起作用。
这是我的代码父片段:

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);
}

}

父片段上的textview没有显示子片段中的字符串d(“按钮单击界面”)

1 个答案:

答案 0 :(得分:0)

为什么要在父片段的回调中检查子片段?

@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);
}

注意: 在任何特定情况下,如果任何object为null,则不会执行您的回调。您已经检查了空引用。