从listview强制关闭新活动

时间:2013-06-18 12:37:56

标签: android android-intent android-listview android-activity

我有一个listView,其中我使用Parcelable将我的对象发送到下一个活动,以便它可以显示列表中所选对象的信息。当我点击该项目并尝试启动下一个活动时,我收到此错误:

06-18 13:29:16.311: E/AndroidRuntime(32754): FATAL EXCEPTION: main
06-18 13:29:16.311: E/AndroidRuntime(32754): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.beerportfoliopro/com.example.beerportfoliopro.BeerPage}: java.lang.NullPointerException
06-18 13:29:16.311: E/AndroidRuntime(32754):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2307)
06-18 13:29:16.311: E/AndroidRuntime(32754):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2357)
06-18 13:29:16.311: E/AndroidRuntime(32754):    at android.app.ActivityThread.access$600(ActivityThread.java:153)
06-18 13:29:16.311: E/AndroidRuntime(32754):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
06-18 13:29:16.311: E/AndroidRuntime(32754):    at android.os.Handler.dispatchMessage(Handler.java:99)
06-18 13:29:16.311: E/AndroidRuntime(32754):    at android.os.Looper.loop(Looper.java:137)
06-18 13:29:16.311: E/AndroidRuntime(32754):    at android.app.ActivityThread.main(ActivityThread.java:5226)
06-18 13:29:16.311: E/AndroidRuntime(32754):    at java.lang.reflect.Method.invokeNative(Native Method)
06-18 13:29:16.311: E/AndroidRuntime(32754):    at java.lang.reflect.Method.invoke(Method.java:511)
06-18 13:29:16.311: E/AndroidRuntime(32754):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
06-18 13:29:16.311: E/AndroidRuntime(32754):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
06-18 13:29:16.311: E/AndroidRuntime(32754):    at dalvik.system.NativeStart.main(Native Method)
06-18 13:29:16.311: E/AndroidRuntime(32754): Caused by: java.lang.NullPointerException
06-18 13:29:16.311: E/AndroidRuntime(32754):    at com.example.beerportfoliopro.BeerPage.onCreate(BeerPage.java:20)
06-18 13:29:16.311: E/AndroidRuntime(32754):    at android.app.Activity.performCreate(Activity.java:5104)
06-18 13:29:16.311: E/AndroidRuntime(32754):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
06-18 13:29:16.311: E/AndroidRuntime(32754):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)

我的代码在这里发布的内容有点多,所以如果它有用的话我会把它粘贴起来。

我的主要人物:

public class MainActivity extends Activity implements OnQueryTextListener {

    private ListView lv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);

        SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
        searchView.setOnQueryTextListener(this);
        return true;
    }

    //get entered search and pop up a toast to show query entered
    public boolean onQueryTextSubmit (String query) {

        //toast query 
        Toast.makeText(this, "Searching for: " + query + "...", Toast.LENGTH_SHORT).show();

        //make json variables to fill

        // url to make request
        String url = "http://api.brewerydb.com/v2/search?key=myKey&format=json&type=beer&withBreweries=y&q=";



        try {
            query = URLEncoder.encode(query, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        String jsonUrl = url + query;

        Log.d("http_string_test", "[" + jsonUrl + "]");

        Toast.makeText(this, jsonUrl, Toast.LENGTH_SHORT).show();

        //todo: get json 
        new ReadJSONResult().execute(jsonUrl);

        return false;
    }

    private class ReadJSONResult extends AsyncTask
    <String, Void, String> {
        protected String doInBackground(String... urls) {
            return readJSONFeed(urls[0]);
        }

        protected void onPostExecute(String result) {
            try {
                System.out.println(result);
                Log.d("asycTask", "[ Gets into asyc task ]");
                ///get 
                Log.d("search", "[ check if we get search results ]");
                Log.d("search", "[" + result + "]");

                JSONObject json = new JSONObject(result);

                //acces listview
                lv = (ListView) findViewById(android.R.id.list);

                //make array list for beer
                List<BeerData> beerList = new ArrayList<BeerData>();



                //get json items
                for(int i = 0; i < json.getJSONArray("data").length(); i++) {

                    String beerId = GetBeerDataFromJSON(i,"id", json);
                    String beerName = GetBeerDataFromJSON(i,"name", json);
                    String beerDescription = GetBeerDataFromJSON(i,"description" , json);
                    String beerAbv = GetBeerDataFromJSON(i,"abv" , json);
                    String beerIbu = GetBeerDataFromJSON(i,"ibu" , json);
                    String beerIcon = GetBeerIconsFromJSON(i, "icon",json );
                    String beerMediumIcon = GetBeerIconsFromJSON(i, "medium",json );
                    String beerGlass = GetBeerGlassFromJSON(i, json );
                    String beerStyle = GetBeerStyleFromJSON(i,"name", json );
                    String beerStyleDescription = GetBeerStyleFromJSON(i,"description", json );
                    String beerBreweryId = GetBeerBreweryInfoFromJSON(i, "id", json );
                    String beerBreweryName = GetBeerBreweryInfoFromJSON(i, "name", json );
                    String beerBreweryDescription = GetBeerBreweryInfoFromJSON(i, "description", json );
                    String beerBreweryWebsite = GetBeerBreweryInfoFromJSON(i, "website", json );
                    String beerBreweryYear = GetBeerBreweryInfoFromJSON(i, "established", json );



                    //create beer object
                    BeerData thisBeer = new BeerData(beerName, beerId, beerDescription, beerAbv, beerIbu, beerIcon,
                            beerMediumIcon, beerGlass, beerStyle, beerStyleDescription, beerBreweryId, beerBreweryName,
                            beerBreweryDescription, beerBreweryYear, beerBreweryWebsite);

                    //add beer to list
                    beerList.add(thisBeer);


                }

                //update listview
                ArrayAdapter<BeerData> adapter1 = new ArrayAdapter<BeerData>(MainActivity.this, R.layout.list_item, R.id.itemName, beerList);
                lv.setAdapter(adapter1);

                //set up clicks
                lv.setOnItemClickListener(new OnItemClickListener() {    
                       @Override
                       public void onItemClick(AdapterView<?> arg0, View arg1,
                                                int arg2, long arg3) {
                              Intent i = new Intent(MainActivity.this, BeerPage.class); 

                              BeerData beerToPass = (BeerData) lv.getItemAtPosition(arg2);

                              i.putExtra("myBeerObject",  beerToPass);   




                              startActivity(i); 
                       } 
                   });






            } catch (Exception e) {
                Log.d("ReadBeerDataTask", e.getLocalizedMessage());
            }          
        }
    }

    private String GetBeerDataFromJSON(int position, String whatToGet, JSONObject json ) {
        String whatIsTheKeyYouAreLookFor = whatToGet;
        int whereInTheJSONArrayForLoopIsTheData = position;
        String holder = "";
        try{
            holder = json.getJSONArray("data").getJSONObject(whereInTheJSONArrayForLoopIsTheData).getString(whatIsTheKeyYouAreLookFor);

        } catch (JSONException e) {
            holder = "N/A";
        }



        return holder;
    }

    //get icons
    private String GetBeerIconsFromJSON(int position, String whatToGet, JSONObject json ) {
        String whatIsTheKeyYouAreLookFor = whatToGet;
        int whereInTheJSONArrayForLoopIsTheData = position;
        String holder = "";
        try{
            holder = json.getJSONArray("data").getJSONObject(whereInTheJSONArrayForLoopIsTheData).getJSONObject("labels").getString(whatIsTheKeyYouAreLookFor);

        } catch (JSONException e) {
            holder = "N/A";
        }



        return holder;
    }

    //get style information
        private String GetBeerStyleFromJSON(int position, String whatToGet, JSONObject json ) {
            String whatIsTheKeyYouAreLookFor = whatToGet;
            int whereInTheJSONArrayForLoopIsTheData = position;
            String holder = "";
            try{
                holder = json.getJSONArray("data").getJSONObject(whereInTheJSONArrayForLoopIsTheData).getJSONObject("style").getString(whatIsTheKeyYouAreLookFor);

            } catch (JSONException e) {
                holder = "N/A";
            }



            return holder;
        }

    //get brewery information
        //get style information
                private String GetBeerBreweryInfoFromJSON(int position, String whatToGet, JSONObject json ) {
                    String whatIsTheKeyYouAreLookFor = whatToGet;
                    int whereInTheJSONArrayForLoopIsTheData = position;
                    String holder = "";
                    try{
                        holder = json.getJSONArray("data").getJSONObject(whereInTheJSONArrayForLoopIsTheData).getJSONArray("breweries").getJSONObject(0).getString(whatIsTheKeyYouAreLookFor);

                    } catch (JSONException e) {
                        holder = "N/A";
                    }



                    return holder;
                }

    //get glass
    private String GetBeerGlassFromJSON(int position, JSONObject json ) {

        int whereInTheJSONArrayForLoopIsTheData = position;
        String holder = "";
        try{
            holder = json.getJSONArray("data").getJSONObject(whereInTheJSONArrayForLoopIsTheData).getJSONObject("glass").getString("name");

        } catch (JSONException e) {
            holder = "N/A";
        }



        return holder;
    }


    //gets the json from the inputed url
    public String readJSONFeed(String URL) {
        StringBuilder stringBuilder = new StringBuilder();
        HttpClient httpClient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(URL);
        try {
            HttpResponse response = httpClient.execute(httpGet);
            StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();
            if (statusCode == 200) {
                HttpEntity entity = response.getEntity();
                InputStream inputStream = entity.getContent();
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(inputStream));
                String line;
                while ((line = reader.readLine()) != null) {
                    stringBuilder.append(line);
                }
                inputStream.close();
            } else {
                Log.d("JSON", "Failed to download file");
            }
        } catch (Exception e) {
            Log.d("readJSONFeed", e.getLocalizedMessage());
        }        
        return stringBuilder.toString();
    }


    @Override
    public boolean onQueryTextChange(String newText) {
        // TODO Auto-generated method stub
        return false;
    }



}

BeerData.java:

public class BeerData implements Parcelable  {
    private String strValue = null;
    private int intValue = 0;

    String beerName;
    String beerId;
    String beerDescription;
    String beerABV;
    String beerIBU;
    String iconLabel;
    String mediumLabel;
    String beerGlass;
    String beerStyle;
    String beerStyleDescription;
    String beerBreweryId;

    String beerBreweryName;
    String beerBreweryDescription;
    String beerBreweryYear;
    String beerBreweryWeb;



    public BeerData(String name, String id, String description, String abv, String IBU, String icon,
            String medium, String glass, String style, String styleDescription, String breweryId, String breweryName,
            String breweryDescription, String breweryYear, String breweryWeb) {
        beerName = name;
        beerId = id;
        beerDescription = description;
        beerABV = abv;
        iconLabel = icon;
        mediumLabel = medium;
        beerGlass = glass;
        beerStyle = style;
        beerStyleDescription = styleDescription;
        beerBreweryId = breweryId;
        beerBreweryName = breweryName;
        beerBreweryDescription = breweryDescription;
        beerBreweryYear = breweryYear;
        beerBreweryWeb = breweryWeb;


    }

    public BeerData(Parcel in) {
        // TODO Auto-generated constructor stub
    }

    public void readFromParcel(Parcel source) {

        beerName = source.readString();
        beerId = source.readString();
        beerDescription = source.readString();
        beerABV = source.readString();
        iconLabel = source.readString();
        mediumLabel = source.readString();
        beerGlass = source.readString();
        beerStyle = source.readString();
        beerStyleDescription = source.readString();
        beerBreweryId = source.readString();
        beerBreweryName = source.readString();
        beerBreweryDescription = source.readString();
        beerBreweryYear = source.readString();
        beerBreweryWeb = source.readString();


    }

    public String getBeerName(){

        return beerName;
    }

    public String toString(){

            return beerName;
        }



    @Override
    public void writeToParcel(Parcel arg0, int arg1) {
        //Log.v(arg0, "writeToParcel..."+ arg1);
        arg0.writeString(beerName);
        arg0.writeString(beerId);
        arg0.writeString(beerDescription);
        arg0.writeString(beerABV);
        arg0.writeString(iconLabel);
        arg0.writeString(mediumLabel);
        arg0.writeString(beerGlass);
        arg0.writeString(beerStyle);
        arg0.writeString(beerStyleDescription);
        arg0.writeString(beerBreweryId);
        arg0.writeString(beerBreweryName);
        arg0.writeString(beerBreweryDescription);
        arg0.writeString(beerBreweryYear);
        arg0.writeString(beerBreweryWeb);


    }

    public String getStrValue()
    {
        return this.strValue;
    }

    public void setStrValue(String strValue)
    {
        this.strValue = strValue;
    }

     public Integer getIntValue()
        {
            return this.intValue;
        }

     public void setIntValue(Integer intValue)
        {
            this.intValue = intValue;
        }

     @Override
        public int describeContents()
        {
            return 0;
        }

     @SuppressWarnings("unchecked")
        public static final Parcelable.Creator CREATOR = new Parcelable.Creator()
        {
            @Override
            public BeerData createFromParcel(Parcel in)
            {
                return new BeerData(in);
            }

            @Override
            public Object[] newArray(int size)
            {
                return new BeerData[size];
            }
        };



}

BeerPage.java:

public class BeerPage extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);




        Bundle b = getIntent().getExtras(); 
        BeerData beer = b.getParcelable("myBeerObject"); 

        TextView tv1 = (TextView) findViewById(R.id.beerTitle);
        tv1.setText("Display This Text in the Text View"); 

        setContentView(R.layout.beer_page);
    }



}

MyCreator.java:

package com.example.beerportfoliopro;

导入android.os.Parcel; import android.os.Parcelable;

public class MyCreator implements Parcelable.Creator<BeerData> {


    public BeerData[] newArray(int size) {
          return new BeerData[size];
    }

    @Override
    public BeerData createFromParcel(Parcel arg0) {
        // TODO Auto-generated method stub
        return null;
    }
}

1 个答案:

答案 0 :(得分:1)

您必须先将内容设置为活动,然后初始化您的视图。如果不是,您将获得NullPointerException。

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.beer_page);  // set the content  
    Bundle b = getIntent().getExtras(); 
    BeerData beer = b.getParcelable("myBeerObject"); 
    TextView tv1 = (TextView) findViewById(R.id.beerTitle); // initialize textview
    tv1.setText("Display This Text in the Text View");    
    }