如何在Data2中访问Class1创建的Data对象实例(不新建对象)?
解决Android跨类访问已创建对象的问题
老哥,我来帮你搞定这个跨类访问对象的难题!你现在的困境是:在Class1里创建了Data实例,但Data2里直接引用时总是空指针,又不想用公共变量,对吧?先看看你的现有代码,再给你几个靠谱的解决方案。
你的现有代码
Data类(数据来源)
public class Data{ private String mName; public Data(String sometext){ this.mName = sometext; } public String getmName(){ return mName; } }
Class1(主Fragment)
public class Class1 extends Fragment{ private Data mData; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInsatanceState){ View view = inflater.inflate(R.layout.one, container, false); mData = new Data("Someone Name"); // ...其他业务代码 return view; } }
存在问题的Data2类
public class Data2{ private Data notworking; public Data2(){ notworking.mName; // 空引用,无法正常访问 notworking.getmName(); // 同样报空指针 } }
问题根源
你在Data2里只声明了notworking这个Data类型变量,但它从来没有被赋值为Class1中已经创建好的mData实例,自然会是空引用。下面几种方法都不用把变量改成公共的,就能解决问题:
方法1:构造函数传递实例(最简单直接的方案)
直接在创建Data2的时候,把Class1里的mData实例通过构造函数传进去,这样Data2就能拿到现成的实例了。
修改后的Data2类:
public class Data2{ private Data mData; // 通过构造函数接收已有的Data实例 public Data2(Data existingData){ this.mData = existingData; // 现在可以正常调用方法了 String targetName = mData.getmName(); } }
在Class1中创建Data2时传入实例:
// 在Class1的onCreateView或其他合适位置 Data2 data2 = new Data2(mData);
方法2:接口回调传递(适合非直接创建场景)
如果Data2的创建时机和Class1不是直接绑定的,可以通过定义接口来传递实例,保证代码的解耦性。
步骤1:定义数据提供接口
public interface DataProvider { // 提供获取已创建Data实例的方法 Data getCurrentData(); }
步骤2:让Class1实现该接口
public class Class1 extends Fragment implements DataProvider{ private Data mData; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInsatanceState){ View view = inflater.inflate(R.layout.one, container, false); mData = new Data("Someone Name"); return view; } @Override public Data getCurrentData() { return mData; } }
步骤3:在Data2中获取实例
public class Data2{ private Data mData; public Data2(Context context){ // 假设Class1是当前显示的Fragment,通过FragmentManager获取实例 FragmentManager fm = ((AppCompatActivity)context).getSupportFragmentManager(); Class1 class1Fragment = (Class1) fm.findFragmentById(R.id.your_fragment_container_id); if(class1Fragment != null){ mData = class1Fragment.getCurrentData(); String name = mData.getmName(); } } }
方法3:依赖注入(进阶方案,适合中大型项目)
如果你的项目规模较大,可以用Dagger、Hilt这类依赖注入框架,把Data实例限定在特定作用域(比如Fragment作用域),这样需要的地方都能拿到同一个实例,不用手动传递,代码更简洁易维护。不过这个方案对小项目来说可能有点“重”,按需选择就好。
内容的提问来源于stack exchange,提问作者Lutz
相关产品推荐
相关产品推荐

