Java类扩展了MainActivity,但findViewById返回null?

时间:2017-02-10 03:00:08

标签: java android findviewbyid

此课程扩展了我的主要活动。

public class Numbers extends MainActivity{

public ArrayList<ImageView> getNumbers () {
    ArrayList<ImageView> numbers = new ArrayList<>();

    ImageView one = (ImageView) findViewById(R.id.one);
    numbers.add(one);
    return numbers;
}

我已经做了一些挖掘,但可以弄清楚为什么我的变量&#34;一个&#34;回来了 我的MainActivity有一个ContentView集。

这是我在MainActivity中onCreate的内容

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ImageView start = (ImageView) findViewById(R.id.start);
    sceneRoot = (ViewGroup) findViewById(R.id.scene_root);
    questionView = findViewById(R.id.questionView);
    startView = findViewById(R.id.startView);
    gameOverView = findViewById(R.id.gameOver);

    animSlide = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.slide);
    animSlide.setAnimationListener(this);
    animZoom = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.zoom_fade);
    animZoom.setAnimationListener(this);

    set.addTransition(new Fade())
       .addTransition(new Slide(Gravity.RIGHT));

    start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getQuestion();
            TransitionManager.beginDelayedTransition(sceneRoot, set);
            startView.setVisibility(View.GONE);
            questionView.setVisibility(View.VISIBLE);
        }
    });
}

public void getQuestion (){
    time = (TextView) findViewById(R.id.timeBar);
    time.startAnimation(animSlide);
}

在点击开始并动画开始之前,我不会调用getNumbers()

public void onAnimationStart(Animation animation){
    if(animation == animSlide) {
        final Questions questions = new Questions();

        Numbers n = new Numbers();

        for (int i = 0; i < n.getNumbers().size(); i++) {
            n.getNumbers().get(i).setVisibility(View.GONE);
            n.getNumbersTen().get(i).setVisibility(View.GONE);
        }
        n.getNumbers().get(0).setVisibility(View.VISIBLE);

编辑:

如果有人想知道,我通过将类扩展为片段而不是我的MainActivity来实现它。然后我在我的xml中使用了片段。

1 个答案:

答案 0 :(得分:1)

因为你扩展了一个Activity类并不意味着setContentView也会被调用。只有在正确启动后才能执行此操作,并在super.onCreate(bundle)

内的onCreate实施中调用Numbers

基本上,您应该从不 new任何活动。它没有生命周期,因此没有内容视图,所以findViewById只是没有工作。

Numbers n = new Numbers();

您无法扩展任何内容,并且在图像列表周围只有一个数据类。

public class Numbers {
    private List<ImageView> numbers = new ArrayList<ImageView>();
    public Numbers() {}
    public void addNumber(ImageView v) { numbers.add(v); }
    public List<ImageView> getNumbers() { return numbers; }
}

来自MainActivity的 ,您可以根据需要查找和添加。

Number n = new Numbers();
n.addNumber((ImageView) findViewById(R.id.one));

但是,我不知道这是否有用,真的......

如果你想要一个&#34;子视图&#34;也许一个片段会有更好的用途。你的活动,但很难说。