0

저는 Android 프로그래밍에 비교적 익숙하지 않습니다. 이 주제에 관해 많은 스레드를 겪었지만 언급 된 솔루션 중 아무 것도 나를 위해 일하지 않았습니다. 여기 내가 뭘하려고하는거야. XML 파일을 사용하여 레이아웃 리소스를 만들고 MainActivity에서 setContentView (R.layout.activity_main)를 수행합니다. 나는 그때 내가 activity_main.xml 파일에 정의 된 기본 레이아웃을 수정하려고 View를 확장하는 커스텀 뷰 클래스를 가지고있다. 그러나, 언제든지 별도의 파일에 구현 된 사용자 정의보기의 findViewById (R.id.) 레이아웃 파일 (activity_main.xml)에서 뷰 ID를 얻으려고하면 항상 null이 반환됩니다. findViewById (...)를 사용하여 MainActivity 클래스에서 ID를 얻으려고하면 적절한 값을 얻습니다.
여기서 내가 뭘 잘못하고 있니? 여기View 클래스의 findViewById가 null을 반환하는 반면 Activity 클래스에서는 작동합니다.

모든 코드가

덕분에 여기

다음
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 파일 "MainActivity.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이 아닌 적절한 값을 얻습니다.

누군가 여기서 잘못된 점을 지적 할 수 있습니까?

감사

답변

3

당신은 쉽게 활동의 레이아웃 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"); 
} 
+0

덕분에 많이. 나는 하루 종일이 포럼과 다른 포럼을 검색 한 후에이 대답을 얻었다. 그것은 지금 일한다!! –

+0

정말 물건 주조 .. 고마워. –

관련 문제