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",片段可能会起到更好的作用,但这很难说。
这个 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",片段可能会起到更好的作用,但这很难说。