片段活动中的空指针异常

时间:2014-04-27 21:17:34

标签: android android-fragments nullpointerexception android-fragmentactivity navigation-drawer

我有以下代码 -

public class MainActivity extends ActionBarActivity
    implements NavigationDrawerFragment.NavigationDrawerCallbacks {




// ASYNC TASK VARIABLES
NewsAsyncTask crackerTask = new NewsAsyncTask();
String NEWSURL = "http://acs.bg/Home/About_ACS/News_and_Events/News.aspx";
String ALERTSURL = "http://acs.bg/Home/About_ACS/News_and_Events/Announcements.aspx";
String EVENTSURL = "http://acs.bg/Home/About_ACS/News_and_Events/Events.aspx";
String string1 = "";
String FINALSTRING = "";
// LISTVIEW tutorial: http://www.youtube.com/watch?v=WRANgDgM2Zg
private List<NewsItem> myNews = new ArrayList<NewsItem>();


String controlTitle = "";
/**
 * Fragment managing the behaviors, interactions and presentation of the navigation drawer.
 */
private NavigationDrawerFragment mNavigationDrawerFragment;

/**
 * Used to store the last screen title. For use in {@link #restoreActionBar()}.
 */
private CharSequence mTitle;

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

    executeThisShit();

    mNavigationDrawerFragment = (NavigationDrawerFragment)
            getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
    mTitle = getTitle();

    // Set up the drawer.
    mNavigationDrawerFragment.setUp(
            R.id.navigation_drawer,
            (DrawerLayout) findViewById(R.id.drawer_layout));
}

@Override
public void onNavigationDrawerItemSelected(int position) {
    // update the main content by replacing fragments
    FragmentManager fragmentManager = getSupportFragmentManager();
}

public void onSectionAttached(int number) {
    switch (number) {
        case 1:
            mTitle = getString(R.string.title_section1);
            controlTitle = getString(R.string.title_section1);
            break;
        case 2:
            mTitle = getString(R.string.title_section2);
            break;
        case 3:
            mTitle = getString(R.string.title_section3);
            break;
    }
}

public void restoreActionBar() {
    ActionBar actionBar = getSupportActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    actionBar.setDisplayShowTitleEnabled(true);
    actionBar.setTitle(mTitle);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (!mNavigationDrawerFragment.isDrawerOpen()) {
        // Only show items in the action bar relevant to this screen
        // if the drawer is not showing. Otherwise, let the drawer
        // decide what to show in the action bar.
        getMenuInflater().inflate(R.menu.main, menu);
        restoreActionBar();
        return true;
    }
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

/**
 * A placeholder fragment containing a simple view.
 */
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class PlaceholderFragment extends Fragment {
    /**
     * The fragment argument representing the section number for this
     * fragment.
     */
    private static final String ARG_SECTION_NUMBER = "section_number";

    /**
     * Returns a new instance of this fragment for the given section
     * number.
     */
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public static PlaceholderFragment newInstance(int sectionNumber) {
        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    public PlaceholderFragment() {
    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = null;

        if (Integer.toString(getArguments().getInt(ARG_SECTION_NUMBER)).equals("1")) {
            rootView = inflater.inflate(R.layout.news, container, false);

        /*TextView textView = (TextView) rootView.findViewById(R.id.section_label);
        textView.setText(Integer.toString(getArguments().getInt(ARG_SECTION_NUMBER)));*/
        } else {

            rootView = inflater.inflate(R.layout.fragment_main, container, false);


        }
        return rootView;

    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        ((MainActivity) activity).onSectionAttached(
                getArguments().getInt(ARG_SECTION_NUMBER));
    }
}

// CUSTOM MINI CLASSES /////////////////////////////////////////////////
public class NewsAsyncTask extends AsyncTask<String, String, String> {
    // Genetics of an AsyncTask:
    // 1. Type of reference(s) passed to doInBackground()
    // 2. Type of reference passed to onProgressUpdate()
    // 3. Type of reference returned by doInBackground(). Value passed to
    // onPostExecute()
    ProgressDialog dialog1;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog1 = ProgressDialog.show(MainActivity.this, "Loading",
                "Fetching data from web...");
    }

    @Override
    protected String doInBackground(String... arguments) {
        // extract arguments
        String newsurl = arguments[0];
        //
        Document root = null;

        try {
            root = Jsoup.connect(newsurl).get();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
        if (root != null) {

            Elements myElements = root.getElementsByClass("news_list")
                    .first().getElementsByTag("table");

            for (Element el : myElements) {
                Element title = el.getElementsByClass("home_title").first();
                Element date = el.getElementsByClass("home_date").first();
                Element link = el.getElementsByClass("news_list_image")
                        .first();
                Element summary = el.getElementsByClass("summary").first();

                populateNewsList(title.text(), summary.text(), date.text(),
                        link.child(0).attr("href"));

            }

            Log.i("ELEMENTS HTML", string1);

        } else {
            string1 = "FAILED TO LOAD";
        }
        return string1;

    }

    @Override
    protected void onPostExecute(String string1) {
        // super.onPostExecute(result);
        if (string1.equals("FAILED TO LOAD")) {
            /*tv2.setText("Failed to load. Check your internet connection.");*/
            if (dialog1 != null) {
                if (dialog1.isShowing()) {
                    dialog1.dismiss();
                }
            }
            Toast.makeText(MainActivity.this,
                    "No web connectivity. Try again later.",
                    Toast.LENGTH_LONG).show();

        }
        FINALSTRING = string1;
       /* tv2.setText(FINALSTRING); */
        if (dialog1 != null) {
            if (dialog1.isShowing()) {
                dialog1.dismiss();
            }
        }
    }



}

public class MyListAdapter extends ArrayAdapter<NewsItem> {
    public MyListAdapter() {
        super(MainActivity.this, R.layout.newsitem, myNews);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // make sure we have a view to work with in the lines below, may be
        // given null
        View newsItem = convertView;
        if (newsItem == null) {
            newsItem = getLayoutInflater().inflate(R.layout.newsitem,
                    parent, false);
        }

        // find the NewsItem we have to work with.
        NewsItem currentNews = myNews.get(position);
        // fill the view.
        ImageView imageView = (ImageView) newsItem
                .findViewById(R.id.newsitem_icon);
        imageView.setImageResource(R.drawable.test_icon); // THIS IS GOING
        // TO BE CHANGED
        // SO IT DOESN'T
        // USE THE
        // DRAWABLE
        // Summary
        TextView summaryText = (TextView) newsItem
                .findViewById(R.id.newsitem_summary);
        summaryText.setText(currentNews.getSummary());
        // Date
        TextView dateText = (TextView) newsItem
                .findViewById(R.id.newsitem_date);
        dateText.setText(currentNews.getDate());
        // Title
        TextView titleText = (TextView) newsItem
                .findViewById(R.id.newsitem_title);
        titleText.setText(currentNews.getTitle());
        return newsItem;
    }
}

// CUSTOM METHODS ////////////////////////////////////////////////////
private void actionButtonRefreshPressed() {
    if (this.isNetworkAvailable()) {
        new NewsAsyncTask().execute(NEWSURL); // calling NEW asynctask
        populateListView();
        registerClickOnListItem();
        /*container.invalidate(); */
        // because an asynctask
        // can be executed only
        // once.
    } else {
        Toast.makeText(MainActivity.this,
                "No web connectivity. Try again later.", Toast.LENGTH_LONG)
                .show();
    }
}

private void populateNewsList(String title, String summary, String date,
                              String link) {
    myNews.add(new NewsItem(title, summary, date, link));

}

private void populateListView() {
    ArrayAdapter<NewsItem> adapter = new MyListAdapter();
    ListView newslist = (ListView) findViewById(R.id.newsListView);
    newslist.setAdapter(adapter);
}

private void registerClickOnListItem() {
    ListView list = (ListView) findViewById(R.id.newsListView);
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View viewClicked,
                                int position, long id) {
            // shows toast with info
            NewsItem clickedNewsItem = myNews.get(position);
            String message = "You clicked position " + position
                    + " Which is " + clickedNewsItem.title;
            Toast.makeText(MainActivity.this, message,
                    Toast.LENGTH_SHORT).show(); // .show is important!
            // otherwise it won't show.
        }
    });
}

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager
            .getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

public void executeThisShit() {
    if (isNetworkAvailable()) {
        crackerTask.execute(NEWSURL);
        populateListView();
        registerClickOnListItem();

    } else {
        Toast.makeText(MainActivity.this,
                "No web connectivity. Try again later.", Toast.LENGTH_LONG)
                .show();

    }


}

}

当我尝试在我的智能手机上执行apllication时,它说它在第353行遇到致命错误(java.lang.NullPointerException) - newslist.setAdapter(adapter); ,379 - executeThisShit()方法和72 - 调用executeThisShit()方法。以前它是在普通活动中工作的。我刚把它转移到片段活动中,这发生了。为什么呢?

提前谢谢!

1 个答案:

答案 0 :(得分:4)

ListView newslist = (ListView) findViewById(R.id.newsListView);中的

你检查过新闻列表是否为空?

在R.layout.activity_main中的toher单词中有一个带有newsListView id的视图