Как я могу получить доступ к представлениям в действиях в TabActivity? - PullRequest
1 голос
/ 25 ноября 2011

У меня есть TabActivity, содержащий другие действия, предназначенные для разделения формы. TabActivity имеет в своем макете кнопку, предназначенную для сбора данных из всех представлений, связанных с формой, по всем действиям, содержащимся в TabActivity, и их сохранения. Проблема, с которой я сталкиваюсь, заключается в том, что TabActivity не имеет доступа к этим представлениям; когда я звоню findViewById() одному из них, я получаю NullPointerException.

Документация, похоже, не совсем точно описывает, как TabActivity работает в отношении контроля действий, которые она содержит. Если при переключении с другого на другое действие разрушается, ситуация, в которой я нахожусь, будет иметь смысл. Я хотел бы знать лучший подход для достижения цели, описанной выше.

SRC / COM / продавец / MyTabActivity.java:

public class MyTabActivity extends TabActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_tab_activity);
        final Button saveButton = (Button) findViewById(R.id.save_button);
        saveButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // NullPointerException happens here
                String fieldValue = ((TextView) findViewById(R.id.text_field)).getText().toString();
            }
        });
    }
}

Рез / макет / my_tab_activity.xml:

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost">
    <LinearLayout>
        <TabWidget android:id="@android:id/tabs"/>
        <FrameLayout android:id="@android:id/tabcontent" />
        <Button android:id="@+id/save_button"/>
    </LinearLayout>
</TabHost>

SRC / COM / продавец / NestedActivity.java:

public class NestedActivity extends Activity {  
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.nested_activity);
    }
}

Рез / макет / nested_activity.xml:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android">  
    <RelativeLayout>
        <EditText android:id="@+id/text_field"/>
    </RelativeLayout>
</ScrollView>

Ответы [ 2 ]

2 голосов
/ 25 ноября 2011

Ваша проблема возникает из этих двух строк в MyTabActivity ...

setContentView(R.layout.my_tab_activity);

... и ...

String fieldValue = ((TextView) findViewById(R.id.text_field)).getText().toString();

... хотя вы, очевидно, знаетеfindViewById(R.id.text_field) - вот что его вызывает.

Использование findViewById(...) работает только при попытке доступа к элементам пользовательского интерфейса, которые были раздуты как часть вашей текущей деятельности.Поскольку в my_tab_activity.xml нет TextView с идентификатором ресурса R.id.text_field, он никогда не будет работать.

Доступ к действиям, которые являются содержимым вкладок из TabHost / TabActivityэто сложно.Я предлагаю использовать SharedPreferences, к которому можно получить доступ из любого места в вашем приложении.Как только TextView (или любой другой элемент пользовательского ввода) будет изменен, сохраните его в SharedPreferences, используя «ключ», который идентифицирует, из какой деятельности / вкладки он пришел.С этого момента TabActivity может легко сопоставлять данные.

1 голос
/ 25 ноября 2011

Вы можете получить ссылку на действия, выполняемые внутри действия вкладки, используя getLocalActivityManager () или getCurrentActivity () . Для возвращаемого объекта активности вы можете выполнить activity.findViewById (), чтобы получить ссылку на представление внутри определенного действия. Но стоит отметить, что TabActivity устарела, и вы должны использовать Fragments , чтобы делать то, что вы ищете. Если вы ориентируетесь на версию Android более ранней, чем 3.0, вы можете использовать библиотеку совместимости для доступа к фрагментам.

...