所以我在代码中设置了一个自定义视图(没有为它定义XML布局),我想知道如何正确定义子视图ID。我 DO 有一个xml文件,定义了与此类似的id ..但至少我理解它,因为我没有xml布局,所以没有AttribSet传递..所以我的构造函数都是just(上下文上下文)类型。
<resources>
<item type="id" name="textview1"/>
<item type="id" name="textview2"/>
</resources>
我的观点看起来像这样:
public class MyView extends View {
protected RelativeLayout baseLayout;
protected TextView textView1;
protected TextView textView2;
public MyView(Context context) {
super(context);
LayoutParams fill = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
setLayoutParams(fill);
Resources res = getResources();
baseLayout = new RelativeLayout(context);
baseLayout.setLayoutParams(fill);
textView1 = new TextView(context);
textView1.setId(R.id.textview1);
// other init stuff here
textView2 = new TextView(context);
textView2.setId(R.id.textview2);
// other init stuff here
baseLayout.addView(textView1);
baseLayout.addView(textView2);
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
// *snip lots of stuff*
baseLayout.draw(canvas);
}
// This is only here because findViewById() returns NULL when I search
public TextView getTextView1() {
return textView1;
}
// This is only here because findViewById() returns NULL when I search
public TextView getTextView2() {
return textView2;
}
}
这是使用视图的活动..
public class MyActivity extends Activity {
// This is only here because findViewById() returns NULL when I search
private MyView myView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Resources res = getResources();
myView = new myView(this);
setContentView(myView);
// This returns NULL. :/
// final TextView textView1 = (TextView) findViewById(R.id.textView1);
// This is only here because findViewById() returns NULL when I search..
final TextView textView1 = myView.getTextView1();
final Animation anim = AnimationUtils.loadAnimation(this, R.anim.my_animation);
textView1.setAnimation(anim);
anim.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationEnd(Animation _anim) {
Log.v("InsideAnimation", "Animation ended");
textView1.setVisibility(View.INVISIBLE);
}
@Override
public void onAnimationRepeat(Animation _anim) {
Log.v("InsideAnimation", "Animation repeated");
}
@Override
public void onAnimationStart(Animation _anim) {
Log.v("InsideAnimation", "Animation started");
}
});
anim.reset();
textView1.startAnimation(anim);
}
}
主要问题是我加载的动画(在xml中定义)和启动绝对没有任何作用。我得到一个“动画开始”的日志声明,但就是这样。它永远不会结束,当我模仿它时它永远不会做任何事情。它就像它开始,但实际上并没有运行。我认为问题是,动画可能希望使用xml id布局定义来完成它,但是因为findViewById()返回NULL,我假设该部分被破坏了(因此动画不起作用)。所以...至少现在,我想知道我在设置ID时遇到了什么问题,这样我就可以让findViewById()返回正确的视图而不是NULL ...然后动画可能会起作用。 (或者如果在那之后它仍然不起作用,我将不得不考虑在代码中定义动画而不是xml)
感谢任何帮助或建议。
答案 0 :(得分:1)
对于编码视图的java有一个setID-method。
答案 1 :(得分:0)
我的猜测是,此时您的TextView尚未实例化。尝试在oncreate-method之外触发动画。
此外,您的MyView已从View扩展,您在里面创建了RelativeLayout。如果你这样做,你也可以直接从RelativeLayout扩展你的类,然后做类似的事情
mRelativeLayout = new MyRelativeLayout(context)
mRelativeLayout.findViewById(R.id.textview1)
也可能是问题所在,因为您的Activity中没有引用RelativeLayout。虽然我的第一个猜测更有可能是解决方案......
哦,你可以简单地用xml设计你的RelativeLayout。我认为在这里以编程方式使用布局没有任何意义......