Tecnologia do Blogger.
RSS

[androidbrasil-dev] Aprendendo a mexer com tabs e fragments (continuação)

Bom, vamos lá. Como quem ja viu algum post meu ja sabe, to apanhando ainda pra mexer com algumas coisas novas pra terminar meu app. Entre elas estão actionbar, tabs, fragment, expandablelistview, todas coisas novas pra mim mas estou tentando implementar da melhor maneira possivel. Estou expondo boa parte do codigo não só pra resolver este ultimo nullpointerexception mas tb para que possam me dar dicas pq as vezes acho que esta uma gambiarra mto grande.
Essa é a activity que gerenciara as tabs (fragments).
public class CardapioActivity extends ActionBarActivity {

public static final String EXTRA_TIPO_ITEM = "item_type";
public static final String EXTRA_ID = "item_id";
public static final int TIPO_PIZZA = 1;
public static final int TIPO_PIZZA_DOCE = 2;
public static final int TIPO_MASSA = 3;
public static final int TIPO_BEBIDA = 4;
public static final int TIPO_VINHO = 5;
public static final int SUBTIPO_LATA_LONGNECK = 6;
public static final int SUBTIPO_600ML = 7;
public static final int SUBTIPO_REFRIGERANTES_AGUAS = 8;
public static final int SUBTIPO_NACIONAIS = 9;
public static final int SUBTIPO_ARGENTINOS = 10;
public static final int SUBTIPO_CHILENOS = 11;
public static final int SUBTIPO_ITALIANOS = 12;

ActionBar actionbar;
public static Database db;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
actionbar = getSupportActionBar();
db = new Database(this);
View v = findViewById(android.R.id.content);
v.setBackgroundResource(R.drawable.fundo);
actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionbar.setDisplayHomeAsUpEnabled(true);

addTabs();

}

private class TabListener implements ActionBar.TabListener {

private CardapioListFragment fragment;

public TabListener(int tipo) {
Bundle args = new Bundle();
args.putInt(EXTRA_TIPO_ITEM, tipo);
fragment = new CardapioListFragment();
fragment.setArguments(args);
}

/* The following are each of the ActionBar.TabListener callbacks */

public void onTabSelected(Tab tab, FragmentTransaction ft) {
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.replace(android.R.id.content, fragment);
}

public void onTabUnselected(Tab tab, FragmentTransaction ft) {

}

public void onTabReselected(Tab tab, FragmentTransaction ft) {

}

}

public void addTabs() {
Tab tab = actionbar.newTab().setText("Pizzas")
.setTabListener(new TabListener(CardapioActivity.TIPO_PIZZA));
actionbar.addTab(tab);

tab = actionbar
.newTab()
.setText("Pizzas Doces")
.setTabListener(
new TabListener(CardapioActivity.TIPO_PIZZA_DOCE));
actionbar.addTab(tab);

tab = actionbar.newTab().setText("Massas")
.setTabListener(new TabListener(CardapioActivity.TIPO_MASSA));
actionbar.addTab(tab);

tab = actionbar.newTab().setText("Bebidas")
.setTabListener(new TabListener(CardapioActivity.TIPO_BEBIDA));
actionbar.addTab(tab);

tab = actionbar.newTab().setText("Vinhos")
.setTabListener(new TabListener(CardapioActivity.TIPO_VINHO));
actionbar.addTab(tab);

}
}

Estou delegando a instanciação do fragment para o construtor do TabListener. Dessa forma, toda vez que eu der um new TabListener(int tipo), ele vai instanciar um novo fragment dentro de si, passando no bundle o inteiro que vai definir qual tipo de item esse fragment vai carregar:

public class CardapioListFragment extends Fragment implements
OnItemClickListener {

private int tipo;
private List<ItemCardapio> lista;
private ListView lv;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tipo = savedInstanceState.getInt(CardapioActivity.EXTRA_TIPO_ITEM);

popularLista(tipo);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.listview_layout, null);
lv = (ListView) v.findViewById(R.id.listview);
lv.setAdapter(new Cardapio_Adapter(getActivity(), lista));
lv.setOnItemClickListener(this);
return v;
}

void popularLista(int tipo) {
lista = new ArrayList<ItemCardapio>();
try {
switch (tipo) {
case CardapioActivity.TIPO_PIZZA:
lista = CardapioActivity.db.getPizzas();
break;
case CardapioActivity.TIPO_PIZZA_DOCE:
lista = CardapioActivity.db.getPizzasDoces();
break;
case CardapioActivity.TIPO_MASSA:
lista = CardapioActivity.db.getMassas();
break;
default:
throw new JSONException(
"Erro ao popular a lista, CardapioListFragment.popularLista();");

}
} catch (JSONException e) {
e.printStackTrace();
}
}

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
ItemCardapio itemcardapio = lista.get(pos);
Toast.makeText(getActivity(),
"Item clicado: " + itemcardapio.getNome(), Toast.LENGTH_SHORT)
.show();

}

}

O layout eh um framelayout com um listview dentro. 

Quando clico para abrir a CardapioActivity, esse eh o erro:

10-08 14:02:59.009: E/AndroidRuntime(535): FATAL EXCEPTION: main
10-08 14:02:59.009: E/AndroidRuntime(535): java.lang.RuntimeException: Unable to start activity ComponentInfo{pizzaria.lafornalha/pizzaria.lafornalha.activity.CardapioActivity}: java.lang.NullPointerException
10-08 14:02:59.009: E/AndroidRuntime(535): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
10-08 14:02:59.009: E/AndroidRuntime(535): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
10-08 14:02:59.009: E/AndroidRuntime(535): at android.app.ActivityThread.access$600(ActivityThread.java:122)
10-08 14:02:59.009: E/AndroidRuntime(535): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
10-08 14:02:59.009: E/AndroidRuntime(535): at android.os.Handler.dispatchMessage(Handler.java:99)
10-08 14:02:59.009: E/AndroidRuntime(535): at android.os.Looper.loop(Looper.java:137)
10-08 14:02:59.009: E/AndroidRuntime(535): at android.app.ActivityThread.main(ActivityThread.java:4340)
10-08 14:02:59.009: E/AndroidRuntime(535): at java.lang.reflect.Method.invokeNative(Native Method)
10-08 14:02:59.009: E/AndroidRuntime(535): at java.lang.reflect.Method.invoke(Method.java:511)
10-08 14:02:59.009: E/AndroidRuntime(535): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
10-08 14:02:59.009: E/AndroidRuntime(535): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
10-08 14:02:59.009: E/AndroidRuntime(535): at dalvik.system.NativeStart.main(Native Method)
10-08 14:02:59.009: E/AndroidRuntime(535): Caused by: java.lang.NullPointerException
10-08 14:02:59.009: E/AndroidRuntime(535): at pizzaria.lafornalha.fragment.CardapioListFragment.onCreate(CardapioListFragment.java:33)
10-08 14:02:59.009: E/AndroidRuntime(535): at android.support.v4.app.Fragment.performCreate(Fragment.java:1455)
10-08 14:02:59.009: E/AndroidRuntime(535): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:893)
10-08 14:02:59.009: E/AndroidRuntime(535): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
10-08 14:02:59.009: E/AndroidRuntime(535): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
10-08 14:02:59.009: E/AndroidRuntime(535): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460)
10-08 14:02:59.009: E/AndroidRuntime(535): at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:556)
10-08 14:02:59.009: E/AndroidRuntime(535): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1133)
10-08 14:02:59.009: E/AndroidRuntime(535): at android.app.Activity.performStart(Activity.java:4475)
10-08 14:02:59.009: E/AndroidRuntime(535): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1928)
10-08 14:02:59.009: E/AndroidRuntime(535): ... 11 more


Está dando nullpointerexception ao receber o tipo do bundle, pelo que eu vi no log. Eu só nao entendo o pq, se eu sempre passo um int para declarar o tipo.
Ajuda?

--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • RSS

0 comentários:

Postar um comentário