如何将片段添加到底层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
所以..它似乎存在但不在布局中 - 如何解释?
答案 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
。