我有一个自定义视图,可以扩展RelativeLayout(可以是任何其他视图组)。在这个视图中,我有几个添加了addView()的framelayout。此视图不存在XML!视图构造函数添加了代码中的所有内容。 我想将此自定义视图用作活动的任何其他内容视图。 我有这个片段活动: MyView myview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myview = new MyView(this);
myview.getSomeContainedFrameLayoutOfView().setId(12345);
setContentView(myview);
}
然后我在onResume
中执行此操作 @Override
protected void onResume() {
super.onResume();
View u = findViewById(12345); // test, returns null
u = myview.findViewById(12345); // test, also null
SomeFragment f = new SomeFragment();
FragmentManager m = getSupportFragmentManager();
FragmentTransaction ft = m.beginTransaction();
ft.replace(12345, f); // ofcourse error (no view found for id)
ft.commit();
}
为什么findViewById
为空?如果我将setContentView()
行更改为
setContentView(R.layout.myframelayouts);
一切正常。所以我怀疑不知何故
setId(12345)
做一些不同于:
android:id="@+id/someid"
我错过了什么?
答案 0 :(得分:0)
getSomeContainedFrameLayoutOfView()返回的视图是否实际包含在RelativeLayout中?也就是说,在MyView的某个地方你有没有调用AddView(theTargetView)?
如果目标视图只是MyView的成员,那么除非你覆盖它,否则实现findViewById的RelativeLayout不知道目标视图。
答案 1 :(得分:0)
我有这样的事情:
public class MojLayout extends LinearLayout {
private FrameLayout lijeviFrame;
private FrameLayout glavniFrame;
private int layoutWidth;
private int panel;
private boolean glavniFrameFullScreen = false;
public MojLayout(final Context context, final float leftWeight) {
super(context);
lijeviFrame = new FrameLayout(context);
glavniFrame = new FrameLayout(context);
post(new Runnable() {
@Override
public void run() {
layoutWidth = getWidth();
panel = (int) (layoutWidth / leftWeight);
init(context);
}
});
}
private void init(Context context) {
lijeviFrame.setId(R.id.lijeviFrame); //defined in /res/values/ids.xml
glavniFrame.setId(R.id.glavniFrame);
LinearLayout container = new LinearLayout(context);
container.setOrientation(HORIZONTAL);
....
container.addView(lijeviFrame);
container.addView(glavniFrame);
addView(container);
}
在onCreate()方法中,我尝试了myView.findViewbyId(R.id.lijeviFrame) - > null,没有myView,相同。 我不明白