2011-06-04 102 views
5

所以我有一個自定義的代碼設置(沒有爲其定義的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)

任何幫助或建議的讚賞。

回答

0

我的猜測是,你的TextView在這一點上沒有實例化。嘗試在oncreate-method之外觸發你的動畫。

此外,你的MyView是從視圖擴展,你在裏面創建一個RelativeLayout。如果你這樣做,你也可以直接從RelativeLayout的擴展您的類,然後像做

mRelativeLayout = new MyRelativeLayout(context) 
mRelativeLayout.findViewById(R.id.textview1) 

也可能是問題,因爲你haven't有你的活動中提及你的RelativeLayout。儘管我的第一個猜測更可能是解決方案...

哦,您可以簡單地在xml中設計您的RelativeLayout。我看到沒有真正的意義,在這裏使用編程佈局...

+0

我可以保證TextView IS實例化。我運行Log.v語句(在我發佈之前)來測試。實例化的輸出出現在試圖通過它的ID找到輸出之前。至於擴展視圖 - 我已經嘗試擴展RelativeLayout而不是View ..但是當我這樣做時,我在onDraw方法內的其他東西不再繪製(我確信我可以修復,但我是不知道爲什麼它不會畫......但無一例外,它不)。 (續) – 2011-06-04 20:29:59

+0

但是,我可以嘗試運行myView.findViewById()而不是隻是findViewById()..這可能工作。我吃完飯後會通知你。就在xml佈局裏面設計而言......我知道我可以做到這一點(事實上已經有了)。但問題是我希望它根據顯示器的尺寸計算值...使用XML不會這樣做,所以我在代碼中而不是xml中工作。我希望我的程序在多個顯示器上看起來都一樣,而不必爲每種類型的顯示器都配置一個xml佈局,但我會嘗試您提到的。 – 2011-06-04 20:31:49

+0

所以我添加了一個方法給我的類,給了我RelativeLayout,然後我運行'myRelativeLayout.findViewById(R.id.textview1)',它實際上是DID返回正確的對象,所以你建議的工作。 :)不幸的是,動畫仍然沒有做任何事情.. Sooooo ..我可能不得不在編碼中編寫出動畫。我不知道。我不是一個新的程序員 - 只是Android的新手,而且它對我來說有些奇怪。 – 2011-06-04 20:50:30

1

對於編碼視圖的java,有一個setID-method

+0

Erm ..是不是我已經使用了什麼? – 2011-06-04 20:32:16

+0

你的確如此。但是你使用setId(R.id ...)似乎很奇怪。我現在可能誤解了這個問題,但是你不是通過引用它已經存在的id(哪個....不存在)來發起一個id。如果這是正確的,那麼你只需要將參數從R.id ..切換到實際的nr。 Sry,如果我說的東西你認爲是顯而易見的和愚蠢的:p – keyser 2011-06-04 23:02:07

+0

id只存在於xml中。當我創建對象時,它沒有與它關聯的id(因爲我沒有用@ id +標籤在xml中定義對象)。所以我在xml中定義一個id(我的第一個代碼塊)..然後我將該ID鏈接到視圖,以便稍後可以返回視圖。這是np,馬丁 - 我只是不知道你是否指的是別的東西。 – 2011-06-04 23:47:49

相關問題