java - Android - 如何从子 SurfaceView 访问 fragment 中的方法?

标签 java android android-fragments

我有一个 SurfaceView 作为 fragment 的 View ,我想从 SurfaceView 中的 fragment 访问变量 diffRadius。我将如何访问 fragment 中的 get 函数。

fragment 代码

public class AsteroidsFragment extends Fragment {

private AsteroidsView asteroidsView;
public int diffRadius;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    super.onCreateView(inflater, container, savedInstanceState);
    View view = inflater.inflate(R.layout.fragment_game, container, false);
    GameActivity activity = (GameActivity) getActivity();
    diffRadius = activity.getDiffRadius();
    asteroidsView = (AsteroidsView) view.findViewById(R.id.asteroidsView);
    return view;
}
public int getDiffRadius()
{
    return diffRadius;
}

SurfaceView代码

public class AsteroidsView extends SurfaceView implements SurfaceHolder.Callback
{
public AsteroidsView(Context context, AttributeSet attrs)
{
    super(context, attrs);
    activity = (Activity) context;

    getHolder().addCallback(this);

    //Set diffRadius to ParentFragment.getDiffRadius()

    asteroidPaint = new Paint();
    backgroundPaint = new Paint();
}

如果您需要更多代码,请告诉我。

最佳答案

你不希望SurfaceView对fragment有硬依赖,但你可以通过干扰进行通信

  1. 创建 RadiusProvider 接口(interface)
  2. 使 fragment 实现该接口(interface)
  3. 在 Surface View 中创建一个方法来设置 radiusProvider。

在界面上

public interface RadiusProvider {
    int getDiffRadius();
 }

在 fragment 上

public class AsteroidsFragment extends Fragment implements RadiusProvider { 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         ...
        asteroidsView = (AsteroidsView) view.findViewById(R.id.asteroidsView);
        asteroidsView.setRadiusProvider(this);
        return view;
    }

    @Override
    public int getDiffRadius() {
        return diffRadius;
    }

在 SurfaceView 上

public class AsteroidsView extends SurfaceView implements SurfaceHolder.Callback {
    ....
    public void setRadiusProvider(RadiusProvider radiusProvider) {
        this.radiusProvider = radiusProvider;
    }
}

这样,SurfaceView 知道如何获取半径,但它不知道有关 fragment 的任何其他信息,并且该 fragment 可以交换为实现 RadiusProvider 的任何其他对象,而 SurfaceView 不会关心。

关于java - Android - 如何从子 SurfaceView 访问 fragment 中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30081706/

相关文章:

java - 使用 Zookeeper 存储用户权限有意义吗

java - Maven:资源二进制文件在构建后更改文件大小

android - 如何在 FlexboxLayout 中使用权重使 3 个线性布局居中?

java - 为什么不建议使用简单的 getter setter 将对象传递给 fragment

java - Glassfish 起始域在 Windows 7 中失败

java - 使用java检查datalake中是否存在文件夹

Android:给定原始图像的Uri,获取SD卡上图像的缩略图

android - 如何在选项卡 Activity 中创建子 Activity

Android获取 fragment 中的Tab位置

java - 如何在我的 for 循环线性布局 ImageView 中添加 OnClickListener?