2 jason white Jason_White 于 2015.06.30 10:41 提问

在Activity中调用Fragment的公有函数,变量为null

Activity代码

                    String phone = ((EditText) findViewById(R.id.phone))
                            .getText().toString();
                    if (phone.isEmpty()) {
                        Toast.makeText(ForgetPsdActivity.this, "请输入手机号码",
                                Toast.LENGTH_LONG).show();
                        break;
                    } else {
                        ForgetPSD2Fragment fragment2 = new ForgetPSD2Fragment();
                        transaction.replace(R.id.fragmentcontainer, fragment2);
                        fragment2.setViewPhone(phone);
                        transaction.addToBackStack(null);
                        step = 2;
                    }

fragment2代码

 public class ForgetPSD2Fragment extends Fragment {
    private View view;
    private TextView txtPhone;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.forgetpsd2, container, false);
        txtPhone = (TextView) view.findViewById(R.id.txtphone);
        return view;
    }

    public void setViewPhone(String phone) {
        if (txtPhone == null) {
            Log.i("debug", phone + "abs");
        }else{
            txtPhone.setText(phone);
        }
    }
}

上边是我写的在Activity与fragment之间通信的例子,但是测试发现在调用fragment2.setViewPhone(phone);的时候,txtPhone为null值,请教一下是为什么,有什么解决办法可以处理这个问题?

2个回答

danielinbiti
danielinbiti   Ds   Rxr 2015.06.30 10:45
已采纳
 fragment2.setViewPhone(phone);//这时候还没初始化
 用
 Bundle bundle = new Bundle();
bundle.putString("order", "1111");
fragment.setArguments(bundle);

然后在fragment中
String name = getArguments().getString("order");
danielinbiti
danielinbiti 回复Jason_White: transaction.replace(R.id.fragmentcontainer, fragment2);这时候才初始化界面
2 年多之前 回复
Jason_White
Jason_White ForgetPSD2Fragment fragment2 = new ForgetPSD2Fragment();这条语句不是已经初始化了么。为什么是没有初始化呢?这里没有初始化的话,请问它的初始化是在什么时候进行的呢?
2 年多之前 回复
lht80s
lht80s   2015.07.01 15:22

ForgetPSD2Fragment fragment2 = new ForgetPSD2Fragment();仅仅是实例化了一个fragment。

你的txtPhone是在fragment的方法onCreateView中实例化的。
而fragment只有在事务提交之后才进入生命周期。
fragment2.setViewPhone(phone);执行时,你还没有提交事务,所以根本就没有进入fragment的生命周期,自然也就没有执行onCreateView方法。
所以txtPhone仅仅是被声明,而没有被实例化,自然是空值。

Csdn user default icon
上传中...
上传图片
插入图片