2012-01-09 15 views
0

私はこれに対する答えを見つけようとしましたが、これまでには成功していません。答えは基本的なオブジェクト指向の考え方にあると思います。ImageViewとjava(Android)のnew演算子を使用する対比

基本的に、私は正常に動作します。このコードを持っている:ここでは

public class Game extends Activity implements OnTouchListener{ 
    ImageView button; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    button= (ImageView) findViewById(R.id.DaImageView); 
    button.setOnTouchListener(this); 
} 

@Override 
public boolean onTouch(View v, MotionEvent e) { 
    Log.d(TAG, "Test output."); 
    return false; 
} 

} 

はXMLファイルです:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_height="wrap_content" 
android:layout_width="wrap_content"> 
<ImageView android:layout_width="wrap_content" 
    android:layout_height="wrap_content"  
    android:src="@drawable/spinning_wheel2" 
    android:id="@+id/DaImageView" 
    android:longClickable="true" /> 
</LinearLayout> 

しかし、私がやりたいことのようなものです:

button = new ImageView(this); 
button.setId(R.id.DaImageView); 
button.setOnTouchListener(this); 

ここで、2行目は正しい表示を参照する必要があります。このようにすると、onTouchListenerは応答しません。これの理由は何ですか?私はImageViewのを拡張するカスタムクラスを持っているので、私はこのようにそれをやりたい

理由は、したがって、それは次のようにキャストすることはできませんされています

button = (customClass) findViewById(R.id.DaImageView); 

私はあなたが持つかもしれないコメントに感謝します!

答えて

1

あなたはこのようにXMLレイアウトでクラス名を指定する必要がcustom componentを使用している場合:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_height="wrap_content" 
android:layout_width="wrap_content"> 
<yourpackage.CustomClassName 
    android:id="@+id/DaImageView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"  
    android:src="@drawable/spinning_wheel2" 
    android:longClickable="true" /> 
</LinearLayout> 

ですから、キャストすることができます - 今の問題もなく - あなたのコード内で:

CustomClass cc = (CustomClass)findViewById(R.id.DaImageView); 

CustomClassの新しいインスタンスを作成する場合、定義済みの既存のインスタンスを取得するのとは異なる、このビューをレイアウト(コード別)に手動で追加する必要があります。 n XMLレイアウトファイル!

+0

ありがとう、私が探していたもの!悪魔は細部にいます。 –

0

付属のXMLリソースをsetContentView()を呼び出すと、XMLレイアウトファイルはXMLファイルは、子ImageViewで親LinearLayoutからなる実際の表示オブジェクトの階層を(生成するために使用されるような「膨張」される;の両方それはViewsである)。

代わりにXMLファイルを使用して、あなたがプログラムオブジェクトのこの階層を作成している可能性があり:つまり、LinearLayoutnewインスタンスを作るには、あなたのActivity用コンテンツビューとして、その後、ImageViewnewインスタンスを作成して追加することを設定しましたそれは子供のようにLinearLayoutへ。

あなたは、この(あなたのコードを引用)ん:

button = new ImageView(this); 
button.setId(R.id.DaImageView); 

すでにXMLリソースから膨張されたものへの参照をつかむとは対照的に、あなたは、新しいImageViewを作成しています。そのViewオブジェクトを実際に階層に表示させるには、add親にLinearLayoutとすることができます。

そして、これは完全に正しいです:カスタムViewの型のオブジェクトを持っている場合は、あなたが行っているよう

button = (customClass) findViewById(R.id.DaImageView); 

は、それはfindViewById()の結果をキャストするために正しいです。要約中のSO

、あなたが理解するためにあなたの質問を読んでから、私は2つの主要な点を考えるには、次のとおりです。

  1. あなたカスタムへの参照がViewを拡張つかむためにfindViewById()を使用することができます。拡張Viewのプロパティにアクセスする必要がある場合は、キャストしてください。は、Viewの階層構造がプログラムで作成されたものであるか、XMLから膨らまされたものか、あるいはその両方が混在したものかを問わず使用できます。一旦階層が存在すると、それはXMLかプログラムかにかかわらず違いはありません。

  2. Viewをプログラムで作成する場合は、Activityのレイアウトマネージャーとして設定されているViewに追加する必要があります。

+0

ありがとうございます。クイックフィックスはkryst4lが答えたものです。しかし、おそらく後の段階でこれを行う必要があります。乾杯! –

関連する問題