将片段添加到基础SurfaceView

时间:2016-11-24 11:21:25

标签: android android-fragments surfaceview setcontentview

如何将片段添加到底层SurfaceView?我得到了例外

java.lang.IllegalArgumentException: No view found for id 0x7f0b0050

我认为这是因为没有在setContentView中设置任何布局,例如

setContentView(R.layout.activity_main);

而是设置了对自定义surfaceview的引用...

final GameSurface gs = new GameSurface(this);
setContentView(gs);

然后在surfaceview回调ontouch(...)中 - 如果用户点击表面,则应该加载一个片段

@Override
public boolean onTouchEvent(MotionEvent event) {

 .....

        FragmentManager fragmentManager =((Activity)context).getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        ExchangeFragment fragment = new ExchangeFragment();
        fragmentTransaction.add(R.id.relLayout, fragment);
        fragmentTransaction.commit();

提前致谢

编辑:

不再崩溃,但碎片不会出现。为什么? 感谢@Kelevandos和另一个堆栈线程的答案

How to inflate one view with a layout

也就是说,我想将AttributSet添加到自定义的surfaceViews构造函数中。

缺少什么?这是xml文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
>


   <se.brickgame.brickbreaker.GameSurface

        android:id="@+id/surfaceId"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
    />

   <RelativeLayout

        android:id="@+id/relLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
    >
   </RelativeLayout>

编辑2:

我还将其添加到代码

 fragmentManager.executePendingTransactions();
 System.out.println("FRAGMENT ISADDED = " + fragment.isAdded());
 System.out.println("FRAGMENT VISIBLE = " + fragment.isVisible());
 System.out.println("FRAGMENT HIDDEN = " + fragment.isHidden());
 System.out.println("FRAGMENT ISINLAYOUT = " + fragment.isInLayout());

并获得以下输出

11-25 16:09:07.957 12155-12155/se.brickgame.brickbreaker ISystem.out: FRAGMENT ISADDED = true
11-25 16:09:07.957 12155-12155/se.brickgame.brickbreaker I/System.out: FRAGMENT  VISIBLE = true
11-25 16:09:07.957 12155-12155/se.brickgame.brickbreaker I/System.out: FRAGMENT HIDDEN = false
11-25 16:09:07.957 12155-12155/se.brickgame.brickbreaker I/System.out: FRAGMENT ISINLAYOUT = false

所以..它似乎存在但不在布局中 - 如何解释?

1 个答案:

答案 0 :(得分:1)

问题是您的GameSurface内部没有ID为R.id.relLayout的视图。必须为片段事务提供一个容器,将片段放入其中。

一种解决方案是为Activity创建一个布局,如下所示:

<RelativeLayout>
    <GameSurface/>
    <RelativeLayout/> //This is the Fragment container
</RelativeLayout>

将其设置为Activity的内容布局,然后像这样检索GameSurface

final GameSurface gs = (GameSurface) findViewById(R.id.yourSurfaceId);

这实际上是应该在Android中处理布局和视图的方式,因此最好重新设计这样的解决方案。

如果由于某种原因你不能/不想,你将不得不重新考虑用另一种方法替换Fragment部分,这不需要Fragment