Android 自定义视图-如何设置其ID';,以便通过findViewById()找到它们?

Android 自定义视图-如何设置其ID';,以便通过findViewById()找到它们?,android,view,null,Android,View,Null,因此,我在代码中设置了一个自定义视图(没有为它定义XML布局),我想知道如何正确定义子视图ID。我确实有一个定义id的xml文件类似于此。。但我如何理解它,至少,因为我没有xml布局,所以没有要传递的属性集。。所以我的构造函数都是(上下文)类型 下面是使用视图的活动 public class MyActivity extends Activity { // This is only here because findViewById() returns NULL when I sear

因此,我在代码中设置了一个自定义视图(没有为它定义XML布局),我想知道如何正确定义子视图ID。我确实有一个定义id的xml文件类似于此。。但我如何理解它,至少,因为我没有xml布局,所以没有要传递的属性集。。所以我的构造函数都是(上下文)类型

下面是使用视图的活动

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中定义)和start完全不做任何事情。我得到一个“动画开始”的日志声明,但仅此而已。当我模仿它时,它永远不会结束,也不会做任何事情。就像它开始了,但实际上并没有运行。我认为问题在于,动画可能希望使用xml id布局定义来完成它的工作,但由于findViewById()返回NULL,我假设该部分已损坏(因此动画无法工作)。所以至少现在,我想找出设置ID的错误所在,这样我就可以让findViewById()返回正确的视图而不是NULL。。。然后动画可能会工作。(或者,如果在这一点之后仍然不起作用,我将不得不考虑用代码而不是xml来定义动画)


非常感谢您提供的任何帮助或建议。

对于java编码视图有一个很好的建议。

我的猜测是,您的TextView目前没有实例化。尝试在oncreate方法之外触发动画

此外,您的MyView是从View扩展而来的,您正在内部创建RelativeLayout。如果这样做,还可以直接从RelativeLayout扩展类,然后执行以下操作

mRelativeLayout = new MyRelativeLayout(context)
mRelativeLayout.findViewById(R.id.textview1)
这也可能是个问题,因为你的活动中没有提到你的亲戚。虽然我的第一个猜测更有可能是解决方案


哦,您可以简单地用xml设计RelativeLayout。我认为在这里使用编程布局没有任何实际意义…

我可以保证TextView是实例化的。。我运行了Log.v语句(在我发布这篇文章之前)来测试它。实例化的输出出现在试图通过ID找到它的输出之前。至于扩展视图,我已经尝试过扩展RelativeLayout而不是View。。但是当我这样做的时候,我在onDraw方法中的其他东西不再绘制(我确信我可以潜在地修复它,但我不确定它为什么不会绘制…但无论如何,它不会)。(续)但是,我可以尝试运行myView.findviewbyd()而不是简单地运行findviewbyd()。。那可能行得通。我吃完后会告诉你的。就只是在xml布局中进行设计而言。。我知道我能做到(事实上我已经做到了)。但问题是我想让它根据显示器的尺寸来计算值。。。使用XML做不到这一点,所以我在代码而不是XML中工作。我希望我的程序在多个显示器上看起来相同,而不必为我可能遇到的每种显示器类型都使用xml布局。。。不过,我将尝试您提到的方法。因此,我在类中添加了一个方法,该方法为我提供了RelativeLayout,然后我运行了
myRelativeLayout.findViewById(R.id.textview1)
,它实际上返回了正确的对象,因此您建议的方法起了作用。:)不幸的是,动画似乎仍然什么也没做。。苏好。。我可能还需要用代码编写动画。我不知道。我不是一个新的程序员,只是刚接触安卓系统,它做了一些我觉得奇怪的事情。别担心,我来自iOS开发公司,安卓系统中的很多东西对我来说都有点奇怪祝你的动画好运!你确实是。但使用setId(R.id…)似乎很奇怪。我现在可能误解了这个问题,但你不是通过引用已经存在的id(它……不存在)来启动id吗。如果这是正确的,那么您只需要将参数从R.id.切换。。如果我说的是你们认为明显而愚蠢的东西,那么就对一个真正的nr.Sry说:P id只存在于xml中。当我创建对象时,它没有与之关联的id(因为我没有用带有@id+标记的xml定义对象)。所以我用xml定义了一个id(我的第一个代码块)。。然后我将该ID链接到视图,以便稍后可以获取该视图。这是np,马丁-我只是不知道你是否指的是其他东西。是的,是的。如果您加载并查看R文件(它位于应用程序包名下的gen文件夹下),您将在其“id”部分下看到附加id。
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);
    }
}
mRelativeLayout = new MyRelativeLayout(context)
mRelativeLayout.findViewById(R.id.textview1)