Публикация того, что сработало для меня, в случае, если кто-то идет по дороге, хотя это необычный случай.
Я установил обработчик, чтобы заставить мой веб-хост использовать более высокую версию php, чем их по умолчанию. Там было 5.1, но я хотел 5.6, поэтому у меня было это:
<FilesMatch \.php$>
SetHandler php56-cgi
</FilesMatch>
в моем файле .htaccess.
При попытке запустить мой сайт локально, наличие в нем вызвало php код для вывода в браузер. Удаление этого решения проблемы.
Поначалу вкладки немного забавны, так как накладываются большие объемы кода, но как только вы проработаете свой путь, они не так уж и плохи. Чтобы заставить вкладки работать, давайте начнем с улучшения вашего 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.
Надеюсь, это поможет!
Вид компоновки в Eclipse может быть немного нестабильным, особенно со сложными компоновками. Немного проб и ошибок может найти узел просмотра, в котором он задыхается.
Что касается дальнейшей разработки макета на основе вкладок, у вас есть два варианта: «быстрый» или «правильный» путь. Во-первых, необходимо адаптировать существующий макет xml, заменив один из TextView на LinearLayout (или какой-либо другой макет), который содержит желаемый контент.
http://google.com/codesearch/p?hl=en#HQNWZ1u2Pig/trunk/HelloLayoutAndroid/res/layout/tab_widget.xml
Однако вкладки обычно используются там, где есть сложное содержание. Для масштабируемости может быть лучше найти TabHost в макете, вызвать newTabSpec (), а затем использовать setContent () для предоставления намерения, которое идентифицирует внутреннее действие, которое предоставляет свой собственный макет.