Как я могу получить доступ к представлениям в действиях в TabActivity?
У меня есть 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 ответа
Ваша проблема исходит из этих двух строк в MyTabActivity
...
setContentView(R.layout.my_tab_activity);
...а также...
String fieldValue = ((TextView) findViewById(R.id.text_field)).getText().toString();
... хотя вы, очевидно, знаете findViewById(R.id.text_field)
это то, что вызывает это.
С помощью findViewById(...)
работает только при попытке доступа к элементам пользовательского интерфейса, которые были раздуты как часть вашей текущей деятельности. Как нет TextView
с идентификатором ресурса R.id.text_field
в my_tab_activity.xml
никогда не сработает.
Доступ к действиям, которые являются содержимым вкладки из TabHost
/ TabActivity
это сложно. Мое предложение будет использовать SharedPreferences
который может быть доступен из любого места в вашем приложении. Когда TextView
(или любой другой элемент пользовательского ввода), сохраните его в SharedPreferences
используя "ключ", который идентифицирует, с какой активности / вкладки он пришел. С тех пор, TabActivity
можно легко сопоставить данные.
Вы можете получить ссылку на действия, выполняемые внутри действия вкладки, используя getLocalActivityManager() или getCurrentActivity (). Для возвращаемого объекта активности вы можете выполнить activity.findViewById(), чтобы получить ссылку на представление внутри определенного действия. Но стоит отметить, что TabActivity устарела, и вы должны использовать фрагменты, чтобы делать то, что вы ищете. Если вы ориентируетесь на версию Android более ранней, чем 3.0, вы можете использовать библиотеку совместимости для доступа к фрагментам.