1

私はAndroidプログラミングに比較的慣れていません。このトピックについて多くのスレッドを調べましたが、言及されている解決策はどれもうまくいきません。ここに私がしようとしているものがあります。XML ファイルを使用してレイアウト リソースを作成しようとしていますが、MainActivity で setContentView(R.layout.activity_main) を実行します。次に、Activity_main.xml ファイルで定義されているデフォルトのレイアウトを変更しようとするビューを拡張するカスタム ビュー クラスがあります。ただし、別のファイルに実装されているカスタム ビューで (レイアウト ファイル activity_main.xml から) findViewById(R.id.) を使用してビュー ID を取得しようとすると、常に null になります。findViewById(...) で MainActivity クラスの id を取得しようとすると、適切な値が取得されます。
ここで何が間違っていますか?

ここにすべてのコードスニペットがあります

ありがとう

ここにファイル「MainActivity.java」があります

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {


    super.onCreate(savedInstanceState);



    setContentView(R.layout.activity_main);

    MyView myView = new MyView(this, null);

      ....

ここにファイル MyView.java があります

public class MyView extends View {

public static final String DEBUG_TAG = "MYVIEW" ;

public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);


    View tablerow1 = (TableRow) findViewById (R.id.tableRow) ;

    Log.v(DEBUG_TAG," tablerow1 = " + tablerow1 + "\n");



}

そして、ここにファイル activity_main.xml があります

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/top_layout"  
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"  >
<TableLayout  
android:id="@+id/tableLayout1"  
android:layout_width="match_parent"  
android:layout_height="0dp"
android:layout_weight="2"
android:background="@color/red"
android:shrinkColumns="*"  
android:stretchColumns="*" >  
<TableRow
    android:id="@+id/tableRow1"  
    android:layout_height="wrap_content"  
    android:layout_width="match_parent"  
    android:gravity="center_horizontal">  

    <Button  
        android:id="@+id/button_00_1"  
        android:text="@string/button_1"
        android:textStyle="bold"
        android:background="@color/green"
        android:layout_margin="0.5dp"
        android:layout_width="0dp"
        android:layout_weight="0.5"           
        android:typeface="serif"></Button> 
    </TableRow>  
  </TableLayout>
</LinearLayout>

MyView.java の findViewById(...) 呼び出しは常に null を返しますが、それを MainActivity.java ファイルに含めると、null 以外の適切な値が得られます。

誰かがここで間違っていることを指摘できますか?

ありがとう

4

1 に答える 1

4

アクティビティのレイアウト xml から任意のビュー/レイアウトに簡単にアクセスできます。コードに欠けているのは、MyView で findViewById() を実行しようとしていて、Activity の他のビューにアクセスしようとしていることだけです。この呼び出しは、MyView に含まれるビューでのみ機能し、その外側では機能しません。ビューにアクセスしようとしているアクティビティの findViewByID() を呼び出す必要があります。例えば:-

((Activity)context).findViewById(R.id.abc).setVisibility(View.VISIBLE);

あなたの場合、次のようにすることができます:-

public class MyView extends View {
   public static final String DEBUG_TAG = "MYVIEW" ;

   public MyView(Context context, AttributeSet attrs) {
   super(context, attrs);
   View tablerow1 = (TableRow) ((Activity)context).findViewById (R.id.tableRow) ;
   Log.v(DEBUG_TAG," tablerow1 = " + tablerow1 + "\n");
}
于 2012-11-06T07:51:17.327 に答える