Java class 扩展 MainActivity 但 findViewById 返回 null?

Java class extends MainActivity but findViewById comes back null?

这个 class 扩展了我的主要 Activity。

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 集。

这是我在MainonCreate中的内容Activity

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

编辑:

如果有人想知道,我通过将 class 扩展为 Fragment 而不是我的 MainActivity 来让它工作。然后我就在 xml.

中使用了片段

因为您扩展了 Activity class 并不意味着 setContentView 也被调用 class。只有在正确启动并且您在 Numbers

中从您自己的 onCreate 实现中调用 super.onCreate(bundle) 时,它才会这样做

基本上,您应该从不 new任何Activity。它没有 life-cycle,因此也没有内容视图,所以 findViewById 根本行不通。

Numbers n = new Numbers();

您无法扩展任何内容并在您的图像列表周围添加 data-only class。

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

不过不知道有没有用,真的...

如果您想要 Activity 的 "sub-view",片段可能会起到更好的作用,但这很难说。