Панель действий вкладки Android

Я пытаюсь использовать панель действий Android для 3.0, где я ссылаюсь на

http://www.youtube.com/watch?v=gMu8XhxUBl8

Код в TabsActivity выглядит следующим образом:

package com.test.actionbar;

import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.Fragment; 
import android.app.FragmentTransaction;
import android.os.Bundle;

public class TabsActivity extends Activity{

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ActionBar bar = getActionBar();
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    ActionBar.Tab tabA = bar.newTab().setText("A Tab");
    ActionBar.Tab tabB = bar.newTab().setText("B Tab");
    ActionBar.Tab tabC = bar.newTab().setText("C Tab");

    Fragment fragmentA = new AFragmentTab();
    Fragment fragmentB = new BFragmentTab();
    Fragment fragmentC = new CFragmentTab();

    tabA.setTabListener(new MyTabsListener(fragmentA));
    tabB.setTabListener(new MyTabsListener(fragmentB));
    tabC.setTabListener(new MyTabsListener(fragmentC));

    bar.addTab(tabA);
    bar.addTab(tabB);
    bar.addTab(tabC);

}

protected class MyTabsListener implements ActionBar.TabListener {

    private Fragment fragment;

    public MyTabsListener(Fragment fragment) {
        this.fragment = fragment;
    }

    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub
        ft.add(R.id.fragment_container, fragment, null);

    }

    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }
  }
}

для пошагового руководства, однако, после завершения руководства, я понял, что в TabsActivity в методе onTabSelected потребуется переменная, которая является container_id, что я не слишком уверен, как я могу предоставить это, даже после просмотра на апи. Я попытался удалить строку и запустить ее на планшете, но она выдает исключение во время выполнения.

Кто-нибудь может мне с этим помочь?

извините, я новичок в программировании для Android, если вопрос звучит слишком просто.

Заранее спасибо.

ИЗМЕНИТЬ

import android.app.ActionBar;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;

public class ActionBarTabs extends Activity {

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ActionBar bar = getActionBar();
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    ActionBar.Tab tabA = bar.newTab().setText("A Tab");
    ActionBar.Tab tabB = bar.newTab().setText("B Tab");
    ActionBar.Tab tabC = bar.newTab().setText("C Tab");

    bar.addTab(tabA);
    bar.addTab(tabB);
    bar.addTab(tabC);
  }
}

ОБНОВЛЕНИЕ

package com.debug.actionbartabs;

import android.app.ActionBar;
import android.app.Activity;
import android.os.Bundle;

public class TabsActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ActionBar bar = getActionBar();
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    ActionBar.Tab tabA = bar.newTab().setText("A Tab");
   bar.addTab(tabA);

   }
}

person simplified.    schedule 23.06.2011    source источник


Ответы (1)


Каждый из классов должен выглядеть так:

public class AFragmentTab extends Fragment
{
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
  {
    return inflater.inflate(R.layout.fragment_a, container, false);
  }
}

А основная активность должна выглядеть так:

package com.test.actionbar;

import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.Fragment; 
import android.app.FragmentTransaction;
import android.os.Bundle;

public class TabsActivity extends Activity{

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ActionBar bar = getActionBar();
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    ActionBar.Tab tabA = bar.newTab().setText("A Tab");
    ActionBar.Tab tabB = bar.newTab().setText("B Tab");
    ActionBar.Tab tabC = bar.newTab().setText("C Tab");

    Fragment fragmentA = new AFragmentTab();
    Fragment fragmentB = new BFragmentTab();
    Fragment fragmentC = new CFragmentTab();

    tabA.setTabListener(new MyTabsListener(fragmentA));
    tabB.setTabListener(new MyTabsListener(fragmentB));
    tabC.setTabListener(new MyTabsListener(fragmentC));

    bar.addTab(tabA);
    bar.addTab(tabB);
    bar.addTab(tabC);

}

protected class MyTabsListener implements ActionBar.TabListener {

    private Fragment fragment;

    public MyTabsListener(Fragment fragment) {
        this.fragment = fragment;
    }

    public void onTabReselected(Tab tab, FragmentTransaction ft) {
    }

    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        ft.add(R.id.fragment_container, fragment, null);
    }

    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        // some people needed this line as well to make it work: 
        ft.remove(fragment);
    }
}

Я только что нашел копию его кода здесь: http://www.abelski.com/courses/android3ui/actionbar.pdf >_‹ Итак, main.xml выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout android:layout_height="wrap_content"
android:layout_width="match_parent"
android:id="@+id/fragment_container"></LinearLayout>
</LinearLayout>
person rawreth    schedule 23.06.2011
comment
@Jonathon Ho спасибо за ваш ответ. я должен где-то объявить идентификатор? потому что я не слишком уверен, где я должен это делать. Я прочитал руководство разработчика, но до сих пор не могу понять концепцию. не могли бы вы указать мне, где я должен добавить материал, чтобы он работал? - person simplified.; 24.06.2011
comment
О, я как бы отредактировал это только сейчас, упс. Я почти уверен, что вы поместили идентификатор в свой XML-файл фрагмента. Фрагменты можно прочитать здесь: developer.android.com/reference/android/app/ Fragment.html Но да, он находится в ‹фрагменте android:id=@+id/___› как бы вы ни назвали свой идентификатор. Он передается автоматически сгенерированному R.java, чтобы вы могли использовать его в своем коде Java. Вы уже пробовали создавать формы для Android с помощью XML-представлений? Это должно быть похоже на это. - person rawreth; 24.06.2011
comment
@Jonathan Ho Я пытался использовать макет xml раньше, но на этот раз он продолжает получать ошибки, например, не может ссылаться на класс, который я изменил на правильный, но он перезаписывается все, что я делаю. - person simplified.; 24.06.2011
comment
Для правильной генерации R.java у вас не должно быть ошибок ни в одном из XML-файлов. Поэтому убедитесь, что синтаксис и ссылки верны в ваших файлах, включая любые изображения, после чего вы можете начать использовать идентификаторы из файла R.java. Кроме того, убедитесь, что вы не используете какие-либо компоненты Android 3.1 в приложении Android 3.0, так как это также несовместимо. - person rawreth; 24.06.2011
comment
@Jonathon Хо, да, все мои материалы на Android 3.0, в любом случае, я не дублировал их и просто использовал все вкладки для ссылки на фрагмент a, где я могу вызвать идентификатор заголовка, но вместо этого теперь он выдает мне исключение во время выполнения. ты случайно не знаешь почему? - person simplified.; 24.06.2011
comment
@ Джонатан Хо, то, что я использовал, точно такое же, как показано в видео, следовательно, не должно быть никаких проблем? поскольку учебник показывает, что его можно скомпилировать и запустить. - person simplified.; 24.06.2011
comment
Можете ли вы опубликовать свой main.xml? О, вы даже не написали setContentView(). Вот чего не хватает в вашем коде из видео. - person rawreth; 24.06.2011
comment
@ Джонатан Хо, может быть, вы сначала поможете мне с этим ... я упростил код, чтобы просто создать панель действий, но он просто выдает мне исключение во время выполнения. код включен в EDIT. - person simplified.; 24.06.2011
comment
Да, теперь я знаю, почему. Это потому, что вы не установилиContentView(). Вы должны сделать setContentView(R.id.main) перед панелью ActionBar. Вам даже не нужно его редактировать. Мой плохой я должен был просто искать его раньше. Это в основном заставляет это работать. - person rawreth; 24.06.2011
comment
@Jonathan Ho я на самом деле не модифицировал main.xml, это тот, который создается при создании проекта. - person simplified.; 24.06.2011
comment
Да, это не имеет значения, просто установите для него ContentView. Вкладки ActionBar делают все остальное. Я только что попробовал код сам. Это есть даже в видео. Мне очень жаль, что я ввел вас в заблуждение повсюду ›_‹ - person rawreth; 24.06.2011
comment
@Jonathan Ho, но проблема с макетом xml по-прежнему не работает. это просто говорит, что мои классы фрагментов не могут быть найдены. - person simplified.; 24.06.2011
comment
Вы должны сделать 3 класса фрагментов, как в видео - person rawreth; 24.06.2011
comment
@Jonathan Хо, хм, я пытаюсь переделать учебник, потому что я испортил код, но дело в том, как я уже сказал, я пытался просто поднять панель действий без каких-либо фрагментов или чего-то еще, только одна панель действий с вкладкой, но это выдает мне исключение во время выполнения. - person simplified.; 24.06.2011
comment
@ Джонатан Хо, может быть, ты сначала поможешь мне с этим? я обновил код тем, что у меня есть в tabsactivity. - person simplified.; 24.06.2011
comment
Хорошо, вот что он сделал в видео: 1. Создал основное действие с помощью onCreate(); 2. Создайте каждый класс AFragmentTab, BFragmentTab, CFragmentTab, java. Код есть в видео, но могу выложить. 3. Сделал 3 xml файла фрагмент_а.xml, фрагмент_b.xml, фрагмент_с.xml и положил их в папку макета - person rawreth; 24.06.2011
comment
@Jonathan Ho код в обновлении должен по праву показывать панель действий с одной вкладкой справа, без какого-либо слушателя или чего-либо еще. - person simplified.; 24.06.2011
comment
@ Джонатан Хо, извини, мне действительно не удалось понять, что ты пытаешься сказать. - person simplified.; 24.06.2011
comment
@ Джонатан Хо, я больше не получаю исключение во время выполнения !! но все еще возникают проблемы с R.id.fragment_place. - person simplified.; 24.06.2011
comment
@Jonathan Ho Я понимаю, что мне нужно поместить идентификатор где-нибудь, чтобы сослаться на него, но я не могу сказать, куда его поместить. - person simplified.; 24.06.2011
comment
@Jonathan Ho спасибо .. мне удалось это получить, но проблема теперь все еще в R.id.fragment_container. может быть, вы можете показать мне, где добавить идентификатор? - person simplified.; 24.06.2011
comment
Я только что нашел копию его кода на его слайдах abelski.com/courses/android3ui/actionbar. .pdf Только что отредактировал код, чтобы он соответствовал вашему, и все должно быть хорошо. надеюсь, есть setContentView() и все, что ему нужно - person rawreth; 24.06.2011
comment
@Jonathan Ho спасибо за вашу помощь. Я уже выяснил причину, почему он не работает. Были некоторые проблемы с фрагментом xml, вызывающим ошибку времени выполнения. - person simplified.; 27.06.2011
comment
Разве вам не нужен ft.remove() в onTabUnselected()? - person Ed Burnette; 13.07.2011