NullPointer exception on ListFragment#getTag()
I have the following ListFragment:
package com.darkraven.shoppinglist;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.drawable.ColorDrawable;
import android.support.v4.app.*;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
/**
* Created by Adrian Utrilla on 2/09/13.
*/
public class GenericListFragment extends ListFragment {
OptionsItemSelectedListener mListener;
private String mTag;
public interface OptionsItemSelectedListener{
public boolean onOptionsItemSelected(MenuItem item);
}
@Override
public void onAttach(Activity activity) {
mListener = (OptionsItemSelectedListener) activity;
super.onAttach(activity);
}
@Override
public void onCreate(Bundle savedInstanceState) {
mTag = getTag();
if(mTag.equals("products"))
setHasOptionsMenu(true);
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setHasOptionsMenu(true);
ItemAdapter listAdapter = new ItemAdapter(getActivity(),
((ShoppingList) getActivity()).items);
setListAdapter(listAdapter);
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
getActivity().getMenuInflater().inflate(R.menu.shopping_list, menu);
super.onCreateOptionsMenu(menu, inflater);
}
public void notifyDataSetChanged(){
((ArrayAdapter) this.getListAdapter()).notifyDataSetChanged();
}
void openNewProductDialog() {
AlertDialog.Builder newProduct = new
AlertDialog.Builder(this.getActivity());
View view1 =
this.getActivity().getLayoutInflater().inflate(R.layout.dialog_add_product,
null);
newProduct.setView(view1);
newProduct.setTitle(R.string.new_product);
final EditText productName = (EditText)
view1.findViewById(R.id.new_product_name_et);
final Spinner productCategory = (Spinner)
view1.findViewById(R.id.new_product_cat_sp);
productName.requestFocus();
ArrayAdapter<String> spinnerAdapter = new
ArrayAdapter<String>(this.getActivity(),
android.R.layout.simple_spinner_dropdown_item,
((ShoppingList) this.getActivity()).getCategoryNames());
productCategory.setAdapter(spinnerAdapter);
newProduct.setPositiveButton(R.string.add, new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Product p = new Product(productName.getText().toString(),
((ShoppingList)
GenericListFragment.this.getActivity()).getCategoryByName((String)
productCategory.getSelectedItem()));
if (!productName.getText().toString().equals("") &&
productCategory.getSelectedItem()!=null)
((ShoppingList)
GenericListFragment.this.getActivity()).items.add(p);
GenericListFragment.this.notifyDataSetChanged();
}
});
newProduct.setNegativeButton(R.string.cancel, new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
newProduct.show();
}
void openNewCategoryDialog() {
AlertDialog.Builder newCategory = new
AlertDialog.Builder(this.getActivity());
final View view =
this.getActivity().getLayoutInflater().inflate(R.layout.dialog_add_category,
null);
newCategory.setView(view);
newCategory.setTitle(R.string.new_category);
final EditText input = (EditText) view.findViewById(R.id.cat_add_tv);
input.requestFocus();
newCategory.setPositiveButton(R.string.add, new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
RadioGroup group = (RadioGroup)
view.findViewById(R.id.radiogroup);
RadioButton selected = (RadioButton)
view.findViewById(group.getCheckedRadioButtonId());
if (input.getText() != null &&
!input.getText().toString().equals("") && selected !=
null){
Category c = new Category(input.getText().toString(),
((ColorDrawable)
selected.getBackground()).getColor());
((ShoppingList)
GenericListFragment.this.getActivity()).items.add(c);
GenericListFragment.this.notifyDataSetChanged();
}
}
});
newCategory.setNegativeButton(R.string.cancel, new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
newCategory.show();
}
public void openDeleteCategoryDialog(int position, final View view){
final Category category = (Category) ((ShoppingList)
this.getActivity()).items.get(position);
new
AlertDialog.Builder(this.getActivity()).setPositiveButton(R.string.delete,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
view.startAnimation(AnimationUtils.loadAnimation(GenericListFragment.this.getActivity(),
R.anim.splashfadeout));
for(Product p : ((ShoppingList)
GenericListFragment.this.getActivity()).getProductsInCategory(category))
{
GenericListFragment.this.getListView().getChildAt(((ShoppingList)
GenericListFragment.this.getActivity()).items.indexOf(p))
.startAnimation(AnimationUtils
.loadAnimation(GenericListFragment.this.getActivity(),
R.anim.splashfadeout));
if(mTag.equals("products"))
((ShoppingList)
GenericListFragment.this.getActivity()).items.remove(p);
else
category.removeFromList(mTag);
}
if(mTag.equals("products"))
((ShoppingList)
GenericListFragment.this.getActivity()).items.remove(category);
}
}).setNegativeButton(R.string.cancel,
null).setTitle(R.string.delete_product)
.setMessage(String.format(this.getResources().
getString(R.string.delete_category_long),
category.name)).show();
}
public void openEditCategoryDialog(int position){
final Category category = (Category) ((ShoppingList)
this.getActivity()).items.get(position);
final View view =
this.getActivity().getLayoutInflater().inflate(R.layout.dialog_add_category,
null);
final EditText categoryName = (EditText)
view.findViewById(R.id.cat_add_tv);
final RadioGroup group = (RadioGroup)
view.findViewById(R.id.radiogroup);
categoryName.setText(category.name);
for(int i=0;i<group.getChildCount();i++) {
if(((ColorDrawable)
group.getChildAt(i).getBackground()).getColor() ==
category.color)
((RadioButton) group.getChildAt(i)).setChecked(true);
}
new
AlertDialog.Builder(this.getActivity()).setView(view).setTitle(R.string.edit_category)
.setPositiveButton(R.string.save, new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
RadioButton selected = (RadioButton) view
.findViewById(group.getCheckedRadioButtonId());
if (categoryName.getText() != null)
category.name =
categoryName.getText().toString();
if (selected != null) {
category.color = (((ColorDrawable)
selected.getBackground()).getColor());
}
for(Product p : ((ShoppingList)
GenericListFragment.this.getActivity()).getProductsInCategory(category))
p.setColor(category.color);
notifyDataSetChanged();
}
}).setNegativeButton(R.string.cancel, new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).show();
}
public void openDeleteProductDialog(int position) {
final Product product = (Product) ((ShoppingList)
this.getActivity()).items.get(position);
new
AlertDialog.Builder(this.getActivity()).setPositiveButton(R.string.delete,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
((ShoppingList)
GenericListFragment.this.getActivity()).items.remove(product);
}
}).setNegativeButton(R.string.cancel,
null).setTitle(R.string.delete_product)
.setMessage(String.format(getResources().
getString(R.string.delete_product_long),
product.getName())).show();
}
public void openEditProductDialog(int position) {
final Product product = (Product) ((ShoppingList)
this.getActivity()).items.get(position);
View view1 =
this.getActivity().getLayoutInflater().inflate(R.layout.dialog_add_product,
null);
final EditText productName = (EditText)
view1.findViewById(R.id.new_product_name_et);
final Spinner category = (Spinner)
view1.findViewById(R.id.new_product_cat_sp);
productName.setText(product.getName());
category.setAdapter(new ArrayAdapter<String>(this.getActivity(),
android.R.layout.simple_spinner_dropdown_item,
((ShoppingList) this.getActivity()).getCategoryNames()));
category.setSelection(((ArrayAdapter) category.getAdapter())
.getPosition(product.getCategory().name));
new
AlertDialog.Builder(this.getActivity()).setTitle(R.string.edit_product)
.setView(view1).setPositiveButton(R.string.save, new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if(productName.getText() != null)
product.setName(productName.getText().toString());
if(category.getSelectedItem() != null)
product.setCategory(((ShoppingList)
GenericListFragment.this.getActivity()).getCategoryByName((String)
category.getSelectedItem()));
notifyDataSetChanged();
}
}).setNegativeButton(R.string.cancel, null).show();
}
}
And the following Activity:
package com.darkraven.shoppinglist;
import android.annotation.TargetApi;
import android.app.ActionBar;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.*;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.SpinnerAdapter;
import com.google.gson.*;
import com.google.gson.reflect.*;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
public class ShoppingList extends FragmentActivity implements
GenericListFragment.OptionsItemSelectedListener,
ActionBar.OnNavigationListener{
ArrayList<Item> items;
ArrayList<String> menuItems = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shopping_list);
menuItems.add(getString(R.string.shopping_list));
SpinnerAdapter mSpinnerAdapter = new
ArrayAdapter<String>(getApplicationContext(),
android.R.layout.simple_spinner_dropdown_item, menuItems);
getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
getActionBar().setListNavigationCallbacks(mSpinnerAdapter, this);
setupActionBar();
readItemArrayList();
if (savedInstanceState != null) {
items = savedInstanceState.getParcelableArrayList("items");
sort();
}
if(items==null) {
items = new ArrayList<Item>();
}
}
@Override
public boolean onNavigationItemSelected(int position, long itemId) {
GenericListFragment newFragment = new GenericListFragment();
FragmentTransaction ft =
getSupportFragmentManager().beginTransaction();
ft.replace(R.id.list, newFragment, menuItems.get(position))
ft.commit();
return true;
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void setupActionBar() {
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.shopping_list, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_add_item:
GenericListFragment newFragment = new GenericListFragment();
FragmentTransaction ft =
getSupportFragmentManager().beginTransaction();
ft.replace(R.id.list, newFragment,
"products").addToBackStack("products");
ft.commit();
break;
default:
return super.onOptionsItemSelected(item);
}
return super.onOptionsItemSelected(item);
}
public void sort() {
ArrayList<Item> _items = new ArrayList<Item>(items);
items.clear();
for (Item i : _items) {
if (i instanceof Category) {
Log.d("Raven", "Spotted category: " + ((Category) i).name);
items.add(i);
for (Item j : _items) {
if (j instanceof Product){
Log.d("Raven", "Processing product " + ((Product)
j).name + ". Category: " + ((Product)
j).category.name);
if(((Product) j).category == i)
items.add(j);
}
}
}
}
Log.d("Raven", "Deleted " + (_items.size() - items.size()) + "
items.");
}
public Product[] getProductsInCategory(Category c) {
ArrayList<Product> products = new ArrayList<Product>();
for (Item i : items)
if (i instanceof Product && ((Product) i).category == c)
products.add((Product) i);
return products.toArray(new Product[products.size()]);
}
public void notifyDataSetChanged(){
for(Fragment f : getSupportFragmentManager().getFragments())
if(f instanceof GenericListFragment)
((GenericListFragment) f).notifyDataSetChanged();
}
String[] getCategoryNames() {
ArrayList<String> categories = new ArrayList<String>();
for (Category c : getCategories())
categories.add(c.name);
return categories.toArray(new String[categories.size()]);
}
Category[] getCategories() {
ArrayList<Category> list = new ArrayList<Category>();
for (Item i : items) {
if (i instanceof Category)
list.add((Category) i);
}
return list.toArray(new Category[list.size()]);
}
public Category getCategoryByName(String name) {
for (Item i : items)
if (i instanceof Category)
if (name.equals(((Category) i).name))
return (Category) i;
return null;
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putParcelableArrayList("items", items);
super.onSaveInstanceState(outState);
}
public void writeItemArrayList(){
try{
File file = new File(this.getFilesDir(), "shoppinglist.json");
/*change here*/Gson gson = new
GsonBuilder().registerTypeHierarchyAdapter(Item.class, new
InterfaceAdapter<Item>())
.create();
FileWriter writer = new FileWriter(file);
writer.write(gson.toJson(items));
writer.flush();
writer.close();
}catch (Exception e){
}
}
public void readItemArrayList(){
try{
FileReader reader = new FileReader(new
File(this.getFilesDir(), "shoppinglist.json"));
Gson gson = new GsonBuilder().registerTypeAdapter(Item.class,
new InterfaceAdapter<Item>())
.create();
this.items = gson.fromJson(reader, new
TypeToken<ArrayList<Item>>(){}.getType());
reader.close();
} catch(Exception e){
e.printStackTrace();
}
}
}
I get the error java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.darkraven.shoppinglist/com.darkraven.shoppinglist.ShoppingList}:
android.view.InflateException: Binary XML file line #7: Error inflating
class fragment Caused by: java.lang.NullPointerException at
com.darkraven.shoppinglist.GenericListFragment.onCreate(GenericListFragment.java:44)
(usage of mTag in my ListFragment). Why could I be getting this error?
No comments:
Post a Comment