【问题标题】:class data returning null after being set设置后返回 null 的类数据
【发布时间】:2013-06-12 18:44:05
【问题描述】:

我有一个类,我通过标准的 get/set 方法分配字符串值。设置值后,它按预期返回它们。当我在另一个片段中调用类值时,它们返回 null。我似乎无法弄清楚。

我如何设置类和设置值。

public class BasicInfo_Assets_Fragment extends Fragment {
    View view
    public static Store_Model store_model = null;
    ...

public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

    view = inflater.inflate(R.layout.fragment_basic_info, container, false);
    ...
    zipCode = zip.getText().toString();        
    // set info        
    store_model = new Store_Model();
    store_model.setZip(zipCode);
    Log.v("STORE" , "Zip: " + store_model.getZip());
    ...

Log.v 完全按照预期打印出:“Zip: 47564”。但是,当我像这样在另一个片段中调用该类时,它会给我一个错误。

public class Options_ListFragment extends ListFragment {
    View view;
    public static Store_Model store_model = BasicInfo_Assets_Fragment.store_model;
    ....
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_options, container, false);
    Log.v("STORE", "Zip: " + store_model.getZip()); <!--- ERROR

如代码中所述,尝试提取该值会给我一个空指针异常。我不明白这个类是如何失去它的价值的。也许我只需要另一双眼睛。提前感谢您的帮助

编辑

感谢@Juan Jose Fidalgo 和@SJuan76。我想通了,我在 Options_ListFragment 中将代码更改为以下内容:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        view = inflater.inflate(R.layout.fragment_options, container, false);       
        if (BasicInfo_Assets_Fragment.store_model != null) {
            LinearLayout ll = (LinearLayout) view
                    .findViewById(R.id.assets_store_info);
            ll.setVisibility(View.VISIBLE);

            store = (TextView) view.findViewById(R.id.store);
            phone = (TextView) view.findViewById(R.id.phone);
            address = (TextView) view.findViewById(R.id.address);
            city = (TextView) view.findViewById(R.id.city);
            zip = (TextView) view.findViewById(R.id.zip);
            state = (TextView) view.findViewById(R.id.state);

            getStoreInfo();
        }

public void getStoreInfo() {
        String mStore = BasicInfo_Assets_Fragment.store_model.getStoreNum();
        String mPhone = BasicInfo_Assets_Fragment.store_model.getPhoneNum();
        String mAddress = BasicInfo_Assets_Fragment.store_model.getAddress();
        String mCity = BasicInfo_Assets_Fragment.store_model.getCity();
        String mZip = BasicInfo_Assets_Fragment.store_model.getZip();
        String mState = BasicInfo_Assets_Fragment.store_model.getState();

        store.setText("Store #: " + mStore);
        phone.setText("Phone #: " + mPhone);
        address.setText("Address: " + mAddress);
        city.setText("City: " + mCity);
        zip.setText("Zip: " + mZip);
        state.setText("State: " + mState);
    }

【问题讨论】:

    标签: java android


    【解决方案1】:

    您正在创建两个变量。一个作为BasicInfo_Assets_Fragment 中的属性,另一个作为Option_ListFragment 中的属性。它们是完全不同的变量。

    如果您在Option_ListFragment 中引用了BasicInfo_Assets_Fragment 实例(我们称之为biaf),您可以将其视图属性引用为biaf.storeModel,这将提供您想要的。

    最佳做法是将storeModel 设为私有并将getStoreModel() 方法添加到BasicInfo_Assets_Fragment。另外,请尝试遵循 Java 命名约定。

    【讨论】:

    • 所以你是说public static Store_Model store_model = BasicInfo_Assets_Fragment.store_model;然后调用store_model.getZip();BasicInfo_Assets_Fragment.store_model.getZip();不一样?
    • 您在原始引用仍然为空的时候分配值。当您稍后更改第一个变量时,第二个变量不会更改。
    【解决方案2】:

    片段

    Options_ListFragment
       public static Store_Model store_model = BasicInfo_Assets_Fragment.store_model;
    

    在比之前执行

    BasicInfo_Assets_Fragment.onCreateView(...)
    

    因为这个原因,什么时候,

    public static Store_Model store_model = BasicInfo_Assets_Fragment.store_model;
    

    被执行,变量

    BasicInfo_Assets_Fragment.store_model 
    

    包含空值。所以,

    Options_ListFragment
      public static Store_Model store_model = BasicInfo_Assets_Fragment.store_model;
    

    获取一个空值。

    片段

     Options_ListFragment
       public static Store_Model store_model = BasicInfo_Assets_Fragment.store_model;
    

    在 ClassLoader 第一次在代码的任何位置调用 Options_ListFragment 类时执行 Options_ListFragment 类。您应该查看何时调用 Options_ListFragment。

    【讨论】:

    • 其实它的工作方式是,你在BasicInfo_Assets_Fragment中填写信息,然后当你返回Options_ListFragment,如果BasicInfo_Assets_Fragment.store_model != null 就会执行,但是它总是返回null。所以它永远不会执行。
    • 因为,“public static Store_Model store_model = BasicInfo_Assets_Fragment.store_model;”,在类加载器加载 Class 时执行。可能如果您将这一行更改为“public Store_Model store_model = BasicInfo_Assets_Fragment.store_model;”它可以正常工作,因为删除片段“public Store_Model store_model = BasicInfo_Assets_Fragment.store_model;”的静态修饰符在创建 Options_ListFragment 的实例之前不会执行。
    猜你喜欢
    • 2011-11-17
    • 2020-05-13
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2021-06-27
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多