You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java新手求助:如何从另一个类的方法中获取值

嘿,作为Java新手遇到这种跨类访问变量的问题真的太常见啦!别慌,我给你整理了几种实用的解决方案,你可以根据自己的代码情况来选:

方法一:给CallFragment添加公共获取方法

这是最直接的方式,只需要在你的CallFragment类里新增一个返回strDate的公开方法:

public class CallFragment extends Fragment {
    private String strDate; // 你定义的字符串变量

    // 添加这个公共方法,供外部调用获取strDate
    public String getStrDate() {
        return strDate;
    }

    // 你原本的其他代码...
}

之后在持有mTextMessage的类里,先拿到CallFragment的实例,再调用这个方法取值:

// 假设你已经通过合适的方式获取到了CallFragment的实例callFragment
String targetDate = callFragment.getStrDate();
mTextMessage.setText(targetDate); // 把值设置给mTextMessage

⚠️ 注意:一定要确保调用getStrDate()的时候,strDate已经被正确赋值了,不然会拿到null哦!

方法二:用接口回调(适合Fragment和Activity通信场景)

如果mTextMessage是在Activity里,或者你希望strDate更新时自动同步到mTextMessage,接口回调会更优雅:

  1. 先定义一个回调接口:
public interface OnDateChangedListener {
    void onDateUpdated(String newDate);
}
  1. 在CallFragment里持有接口引用,当strDate变化时触发回调:
public class CallFragment extends Fragment {
    private String strDate;
    private OnDateChangedListener mListener;

    // 当Fragment依附到Activity时,绑定接口
    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        try {
            mListener = (OnDateChangedListener) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + " 必须实现OnDateChangedListener接口");
        }
    }

    // 当你更新strDate的时候,调用这个方法通知外部
    private void updateStrDate(String newDate) {
        strDate = newDate;
        if (mListener != null) {
            mListener.onDateUpdated(strDate);
        }
    }
}
  1. 在持有mTextMessage的Activity里实现接口,直接更新UI:
public class YourActivity extends AppCompatActivity implements OnDateChangedListener {
    private TextView mTextMessage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);
        mTextMessage = findViewById(R.id.text_message);
    }

    @Override
    public void onDateUpdated(String newDate) {
        // 这里直接拿到更新后的strDate,赋值给mTextMessage
        mTextMessage.setText(newDate);
    }
}
方法三:使用ViewModel(Jetpack架构项目首选)

如果你的项目用了Android Jetpack,ViewModel是跨组件共享数据的最佳方案,能完美避免生命周期带来的问题:

  1. 创建一个共享的ViewModel:
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class SharedDateViewModel extends ViewModel {
    private MutableLiveData<String> dateLiveData = new MutableLiveData<>();

    // 设置日期的方法
    public void setDate(String date) {
        dateLiveData.setValue(date);
    }

    // 获取日期的可观察对象
    public MutableLiveData<String> getDateLiveData() {
        return dateLiveData;
    }
}
  1. 在CallFragment里更新ViewModel的数据:
public class CallFragment extends Fragment {
    private SharedDateViewModel viewModel;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 通过requireActivity()获取和Activity共享的ViewModel实例
        viewModel = new ViewModelProvider(requireActivity()).get(SharedDateViewModel.class);
    }

    // 当需要更新strDate时,调用ViewModel的方法
    private void updateDate() {
        String strDate = "你的目标日期值";
        viewModel.setDate(strDate);
    }
}
  1. 在持有mTextMessage的类里观察数据变化,自动更新UI:
public class YourActivity extends AppCompatActivity {
    private TextView mTextMessage;
    private SharedDateViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);
        mTextMessage = findViewById(R.id.text_message);

        viewModel = new ViewModelProvider(this).get(SharedDateViewModel.class);
        // 观察数据变化,一旦有更新就自动设置给mTextMessage
        viewModel.getDateLiveData().observe(this, newDate -> {
            mTextMessage.setText(newDate);
        });
    }
}

内容的提问来源于stack exchange,提问作者BaRud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:22:29