当前位置: 代码迷 >> Android >> Java类扩展了MainActivity,但是findViewById返回null吗?
  详细解决方案

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

热度:68   发布时间:2023-08-04 09:49:37.0

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

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;
}

而且我做了一些挖掘,但是可以弄清楚为什么我的变量“ one”返回null。
我的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);

编辑:

如果有人想知道,我可以通过将类扩展为Fragment而不是MainActivity来使其工作。 然后,我只在xml中使用了该片段。

因为扩展了Activity类并不意味着setContentView被该类调用。 只有正确启动它,并且您从Numbers自己的onCreate实施调用super.onCreate(bundle) ,它才会这样做

基本上,您绝不应该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));

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

如果您想要“活动”的“子视图”,也许Fragment可以达到更好的目的,但这很难说。

  相关解决方案