Как добавить элементы управления в макет вкладки в Android?
Я следую этому руководству https://developer.android.com/guide/tutorials/views/hello-tabwidget.html и завершил его. Теперь я бы хотел добавить, что вы знаете некоторые элементы управления для этих вкладок, таких как текстовые поля (редактирование текста).
Как мне это сделать? Я перехожу к своему mail.xml, используя eclipse как свой идеал, и перехожу к макету, и теперь я получаю исключение NullPointerException, поэтому я больше не могу перетаскивать материал в макет.
Edit
Это то, что у меня есть
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/textview1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="this is a tab" />
<EditText android:text="" android:id="@+id/EditText01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:password="true"></EditText>
</LinearLayout>
<TextView
android:id="@+id/textview2"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="this is another tab" />
<TextView
android:id="@+id/textview3"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="this is a third tab" />
</FrameLayout>
</LinearLayout>
</TabHost>
Ответы
Ответ 1
Вкладки немного забавны, чтобы начать работать изначально, так как там много накладных расходов кода, но как только вы проработали свой путь, это не так уж плохо. Чтобы заставить вкладки работать, начните с улучшения вашего XML файла, и тогда мы сможем убедиться, что ваш код действительно загружает их правильно.
Прежде всего, ваш XML файл. Вместо того, чтобы включать все непосредственно в ваш main.xml, вы должны использовать функцию include
. Как следует из названия, это позволяет вам работать с отдельным XML файлом, а затем включать его в основную строку с одной строкой. Это значительно упрощает чтение файла main.xml. Поэтому мы изменили бы ваш файл выше, чтобы он выглядел следующим образом:
//No need to change anything above this
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<include layout="@layout/tab1"/>
<include layout="@layout/tab2"/>
//and however many other tabs you want to include
</FrameLayout>
Затем вам нужно создать tab1.xml, tab2.xml и т.д. Это обычные файлы xml, в которых они начинаются с ViewGroup (то есть LinearLayout, RelativeLayout), который содержит любое количество других виджетов. Эти виджеты могут быть такими, как EditTexts, кнопки, пользовательские представления, все, что вы хотите. Единственное правило заключается в том, что родительская ViewGroup (верхняя часть) должна иметь уникальный идентификатор в ней, как android:id="@+id/someUniqueName"
. Вы будете использовать это, чтобы ссылаться на этот конкретный макет/вкладку в вашем коде. Так, например, это будет:
tab1.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/tab1Layout"
android:orientation="vertical">
<TextView ... />
<EditText ... />
</LinearLayout>
Сделав это, мы можем посмотреть на ваш код. Я предполагаю, что вы, вероятно, уже получили это, но на всякий случай здесь, что вы хотите:
public class YourProject extends TabActivity {
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Resources res = getResources();
TabHost tabHost = getTabHost();
tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("Tab1 title",
res.getDrawable(R.drawable.logo1)).setContent(R.id.tab1Layout));
(...)
//You can also fill tabs with a separate activity like so:
Intent intent = new Intent(this, YourClass.class);
tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("Another title",
res.getDrawable(R.drawable.logo2)).setContent(intent));
tabHost.setCurrentTab(0);
}
}
Как показано выше, вы можете настроить содержимое одной из вкладок отдельной деятельностью. В этом случае действие определяется так же, как и любое другое со своим собственным классом, макетом и т.д. Обычно вы не должны этого делать и вместо этого просто используете другой вид (с setContent(R.id.tabXLayout)
, но иногда это необходимо. вы хотите, чтобы одна из ваших вкладок имела список, тогда вам нужно запустить там активную деятельность, которая расширяет ListView и включает весь шаблонный код для ListViews.
Я надеюсь, что это поможет!
Ответ 2
Вид макета в Eclipse может быть немного шелушащимся, особенно со сложными макетами. Немного проб и ошибок может найти View node, который задыхается.
Что касается разработки макета на основе вкладок, у вас есть два варианта: "быстрый" или "правильный". Сначала нужно адаптировать существующий макет xml, заменив один из TextViews на LinearLayout (или какой-либо другой макет), который содержит нужное вам содержимое.
http://google.com/codesearch/p?hl=en#HQNWZ1u2Pig/trunk/HelloLayoutAndroid/res/layout/tab_widget.xml
Однако вкладки обычно используются там, где есть сложный контент. Для масштабирования может быть лучше найти TabHost в макете, вызвать newTabSpec(), а затем использовать setContent() для предоставления Intent, который идентифицирует внутреннюю активность, которая предоставляет свой собственный макет.
Ответ 3
включение часто создает проблемы при разборе XML, я попробовал его и получил: не могу разрешить @layout/mylayout..
мой код был правильным 100%, но это обычная проблема spicialy, если вам нужен Id для макета и других атрибутов.
просто: Я решаю его в режиме отладки, когда вы бросаете tabhost в свой макет, размещаете его везде, где хотите, он создает 3 линейных макета (tab1, tab2, tab3)... в редакторе XML, на каждой вкладке (leanheadayout) вставьте свою разметку элемента управления, который необходимо использовать в качестве содержимого вкладки.
и в java файле сделайте следующее:
TabHost tabHost = (TabHost)findViewById(R.id.tabHost);
tabHost.setup();
TabHost.TabSpec tab1 = tabHost.newTabSpec("smil1");
TabHost.TabSpec tab2 = tabHost.newTabSpec("smil2");
TabHost.TabSpec tab3 = tabHost.newTabSpec("smil3");
tab1.setIndicator("#1");//the name will apear on the first tab
tab1.setContent(R.id.smiles1); // the Id of the control you put in the first LeanerLayout
tab2.setIndicator("#2"); // the same as abouv but for the second tab
tab2.setContent(R.id.smiles2);
tab3.setIndicator("#3"); // the thierd tab
tab3.setContent(R.id.smiles3);
// add the tabs
tabHost.addTab(tab1);
tabHost.addTab(tab2);
tabHost.addTab(tab3);
Это способ решения вашей проблемы, если include делает проблему при анализе XML.
Ответ 4
NullPointerException
в редакторе макетов известная ошибка в средствах разработки Android.