所以我有一個自定義的代碼設置(沒有爲其定義的XML佈局),並想知道如何獲得正確定義的子視圖ID。我DO有一個XML文件定義id的類似於這..但我的理解,至少,因爲我沒有一個XML佈局沒有AttribSet傳遞..所以我的構造函數都只是(上下文上下文)類型。自定義視圖 - 如何設置其ID以便通過findViewById()找到它們?
<resources>
<item type="id" name="textview1"/>
<item type="id" name="textview2"/>
</resources>
而我的觀點看起來沿着這些路線的東西:
public class MyView extends View {
protected RelativeLayout baseLayout;
protected TextView textView1;
protected TextView textView2;
public MyView(Context context) {
super(context);
LayoutParams fill = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
setLayoutParams(fill);
Resources res = getResources();
baseLayout = new RelativeLayout(context);
baseLayout.setLayoutParams(fill);
textView1 = new TextView(context);
textView1.setId(R.id.textview1);
// other init stuff here
textView2 = new TextView(context);
textView2.setId(R.id.textview2);
// other init stuff here
baseLayout.addView(textView1);
baseLayout.addView(textView2);
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
// *snip lots of stuff*
baseLayout.draw(canvas);
}
// This is only here because findViewById() returns NULL when I search
public TextView getTextView1() {
return textView1;
}
// This is only here because findViewById() returns NULL when I search
public TextView getTextView2() {
return textView2;
}
}
下面是一個使用該視圖的活動..
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中定義)並且開始沒有任何作用。我得到了「動畫開始」的Log聲明,但就是這樣。它永遠不會結束,我仿效它時從不做任何事情。這就像它開始,但實際上並沒有運行。我認爲問題是,也許動畫期望使用xml id佈局定義來做它的工作,但由於findViewById()返回NULL,我假設零件已損壞(並因此動畫不起作用)。所以..至少現在,我想知道我在設置ID時做了什麼錯誤,以便我可以使用findViewById()返回正確的視圖,而不是NULL ...然後可能動畫將工作。 (或者如果它在那之後仍然不起作用,那麼我將不得不看看也許在代碼中定義動畫而不是xml)
任何幫助或建議的讚賞。
我可以保證TextView IS實例化。我運行Log.v語句(在我發佈之前)來測試。實例化的輸出出現在試圖通過它的ID找到輸出之前。至於擴展視圖 - 我已經嘗試擴展RelativeLayout而不是View ..但是當我這樣做時,我在onDraw方法內的其他東西不再繪製(我確信我可以修復,但我是不知道爲什麼它不會畫......但無一例外,它不)。 (續) – 2011-06-04 20:29:59
但是,我可以嘗試運行myView.findViewById()而不是隻是findViewById()..這可能工作。我吃完飯後會通知你。就在xml佈局裏面設計而言......我知道我可以做到這一點(事實上已經有了)。但問題是我希望它根據顯示器的尺寸計算值...使用XML不會這樣做,所以我在代碼中而不是xml中工作。我希望我的程序在多個顯示器上看起來都一樣,而不必爲每種類型的顯示器都配置一個xml佈局,但我會嘗試您提到的。 – 2011-06-04 20:31:49
所以我添加了一個方法給我的類,給了我RelativeLayout,然後我運行'myRelativeLayout.findViewById(R.id.textview1)',它實際上是DID返回正確的對象,所以你建議的工作。 :)不幸的是,動畫仍然沒有做任何事情.. Sooooo ..我可能不得不在編碼中編寫出動畫。我不知道。我不是一個新的程序員 - 只是Android的新手,而且它對我來說有些奇怪。 – 2011-06-04 20:50:30