【问题标题】:How to get value from childfragment to parentfragment?如何从 childfragment 到 parentfragment 获得价值?
【发布时间】:2018-10-17 09:38:13
【问题描述】:

我很沮丧。
我想从子片段获取价值到父片段 我尝试了很多方法。
interface、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(“按钮点击界面”)

【问题讨论】:

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


    【解决方案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);
    }
    

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

    【讨论】:

    • 我试过了,但还是不行。 pf.data("按钮点击界面")出现错误“java.lang.NullPointerException”;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 2021-01-21
    • 2021-07-28
    • 1970-01-01
    相关资源
    最近更新 更多