findViewById в клас View връща нула, докато работи в клас Activity

Аз съм сравнително нов в програмирането за Android. Прегледах много теми по тази тема, но нито едно от споменатите решения не работи за мен. Ето какво опитвам. Опитвам се да създам ресурс за оформление с XML файл и в моята MainActivity правя setContentView(R.layout.activity_main). след това имам персонализиран клас за изглед, който разширява изгледа, в който се опитвам да променя оформлението по подразбиране, дефинирано във файла activity_main.xml. Въпреки това всеки път, когато се опитам да получа ID на изглед с findViewById(R.id.) (от файла с оформлението activity_main.xml) в персонализирания изглед, внедрен в отделен файл, винаги получавам нула. Ако се опитам да получа идентификатора в класа MainActivity с findViewById(...), получавам правилна стойност.
Какво правя грешно тук?

Ето всички кодови фрагменти

Благодаря

Ето файла "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>

Извикването findViewById(...) в MyView.java винаги връща нула, докато ако го включа във файла MainActivity.java, получавам правилни ненулеви стойности.

Може ли някой да посочи какво не е наред тук?

Благодаря


person sri_s    schedule 05.11.2012    source източник


Отговори (1)


Можете лесно да получите достъп до всеки изглед/оформление от xml оформлението на вашата дейност. Единственото нещо, което ви липсва в кода ви е, че се опитвате да изпълните findViewById() в MyView и се опитвате да получите достъп до другите изгледи на дейността. Това повикване ще работи само върху изгледа, който е затворен във вашия 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");
}
person Ethan Hunt    schedule 06.11.2012
comment
Благодаря много. Получих този отговор, след като търсих този и други форуми цял ден. Сега работи!! - person sri_s; 06.11.2012