Tecnologia do Blogger.
RSS

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

Isso não funciona:
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.item_menu_layout, null);
LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();
params.setMargins(5, 10, 5, 0);
view.setLayoutParams(params);

Da erro em tempo de execução.

Em quarta-feira, 9 de outubro de 2013 10h44min35s UTC-3, Matheus Henrique da Silva escreveu:
Eu acho que descobri o que era. Eu pego esse bundle via getArguments() e não no que vem como parametro. Agora ta dando certo.
O que estou tendo dificuldades ultimamente eh com design. Não consigo setar a altura do item do listview, mesmo setando o layout_height no elemento root do layout que seta a view. Como estou setando um background, percebi que cada linha parece ficar com a altura necessaria pra apresentar os itens que tem nela como se fosse um wrap_content, pq a altura tem variado de acordo com a imagem do background. Eu precisava justamente do contrario, que eu pudesse setar a altura e o background se ajustasse a ela, pq senao como eu vou ter um controle do layout em diversos dispositivos? Se eu conseguisse setar uma margem entre os itens tb seria mto bom, pra dar um espaçamento na listview.
Desde ja, obrigado.

Em terça-feira, 8 de outubro de 2013 21h08min39s UTC-3, Rodrigo Piovezan escreveu:
Acho que o erro é porque você não testa se savedInstanceState é diferente de null antes de fazer o savedInstanceState.getInt(). Ele pode vir null em alguns momentos (por exemplo na primeira vez que onCreate é chamado, e ainda não foi executado o método onSaveInstanceState() onde você provavelmente salva o tipo) e daí dá o pau.


On Tue, Oct 8, 2013 at 11:30 AM, Matheus Henrique da Silva <matheust...@gmail.com> wrote:
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-...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

--
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