【问题标题】:null pointer exception android sunshine lesson 1空指针异常安卓阳光第一课
【发布时间】:2015-10-14 17:19:17
【问题描述】:

我正在通过 udacity android 课程学习 android。我正在使用安卓工作室。 我被困在一个点,我应该看到一个带有示例数据的列表视图,而不是我有 NUllPointerException 并且应用程序每次都崩溃。

MainActivity.java

package com.example.android.sunshine.app;

import android.support.v7.app.ActionBarActivity;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
 import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

//import static com.example.android.sunshine.app.R.id.listView_forecast;


public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment())
                .commit();
    }
}

@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);
    return true;
}

@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();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

/**
 * A placeholder fragment containing a simple view.
 */
public static class PlaceholderFragment extends Fragment {
    private ArrayAdapter<String> forecastAdapter;
    public PlaceholderFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        String[] data = {
                "Today-Sunny-88/63",
                "Tomorrow-Sunny-88/63",
                "Weds-Sunny-88/63",
                "Thurs-Sunny-88/63",
                "Fri-Sunny-88/63",
                "Sat-Sunny-88/63",
                "Sun-Sunny-88/63",
        };
        List<String> weekForecast = new ArrayList<String>(Arrays.asList(data));
        forecastAdapter = new ArrayAdapter<String>(getActivity(),
                R.layout.list_item_forecast,
                weekForecast);

        ListView listView = (ListView) rootView.findViewById(R.id.listView_forecast);
        listView.setAdapter(forecastAdapter);
        return rootView;
    }
}
}

我的 Fragment_main.xml 文件:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.android.sunshine.app.MainActivity$PlaceholderFragment">


<ListView
    android:id="@+id/listView_forecast"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

我的 list_item_forrecast.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
android:id="@+id/list_view_textview">
</TextView>

tried this solution, still not working

Logcat screenshot

【问题讨论】:

  • 同样使用Log检查listView的大小,然后再设置到adapter中。
  • 发布您的日志猫,顺便说一句,这条线是无用的List&lt;String&gt; weekForecast = new ArrayList&lt;String&gt; (Arrays.asList(data));,因为您仍然可以将ArrayAdapterString[] 一起使用,而不仅仅是ArrayList
  • MainActivity.java ?以及您调用 onCreateView 并像 Fragment 一样膨胀...请发布所有有问题的代码
  • @SaNtoRiaN 感谢您的建议,我不知道,3-4 天前开始学习 :) 发布 logcat
  • @PrateekKhandelwal 不客气 :)

标签: android android-studio nullpointerexception


【解决方案1】:

在 Fragment 生命周期中,onCreateView() 在 Fragment 访问 Activity 实例之前的更早阶段被调用。只有在 onActivityCreated() 被调用后,Fragment 才能使用 Activity 的上下文。

您的问题是您在 onCreateView() 中使用getActivity() 来初始化适配器。将其移至 onActivityCreated() 就可以了。

一个普遍的建议:不要在 onCreateView() 中写太多的逻辑。只需膨胀并返回视图。将大部分逻辑写在 onActivityCreated() 中,因为到那时你肯定知道你有 Activity 的 Context。

【讨论】:

  • 这可能也有帮助:stackoverflow.com/questions/8041206/…
  • onActivityCreated() 是指 MainActivity 类中的 onCreate() 吗?实际上我正在关注教程,他们的存储库中有相同的代码。
  • onCreate 用于活动。 onActivityCreated 用于片段。由于您使用的是片段,因此我在该上下文中进行了解释。否则,在这种情况下你真的不需要片段。只需直接使用活动,如另一个答案中所述。
  • 很抱歉问了一些愚蠢的问题,但我刚刚开始学习。我在我的代码中找不到 onActivityCreated()。
  • 您必须在 Fragment 类中覆盖它。它与 onCreateView 方法处于同一级别。你需要覆盖它。并且可以提问。 :)
【解决方案2】:

您的适配器如何知道要使用哪个 TextView?

把你的适配器改成这个..

forecastAdapter = new ArrayAdapter<String>(getActivity(),R.layout.list_item_forecast,R.id.list_view_textview,weekForeCast);

【讨论】:

  • 你遇到了和以前一样的异常吗?
【解决方案3】:

试试这个简单的代码来创建ListView。将您的 onCreate() 方法更改为以下

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


    String[] data = new String[]{"Item1, Item2, Item3, Item4"};

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item_forecast, data);

    ListView lv = (ListView) findViewById(R.id.list);
    lv.setAdapter(adapter);
}

然后删除整个班级PlaceholderFragment
在您的 activity_main 布局文件中添加以下代码

<ListView
    android:id="@+id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

【讨论】:

  • 必须在框架布局中或外部添加listView?
  • 谢谢!它有效,但你能告诉我我的代码有什么问题吗?我正在关注教程,它要求在 PlaceholderFragment 类中进行更改
【解决方案4】:

根据您在上面粘贴的字符串数据数组的代码。 字符串 [] 数据 = { “今天-Sunny-88/63”, “明天-晴天-88/63”, "Weds-Sunny-88/63", “星期四-晴-88/63”, “星期五-晴-88/63”, “周六-阳光-88/63”, "Sun-Sunny-88/63", };

您忘记删除最后一个元素上的逗号。

应该是这样的

字符串[] 数据 = { “周一 6 月 23 日  - 晴天 - 31 月 17 日”, “星期二 6/24 - 有雾 - 21/8”, “周三 6/25 - 多云 - 22/17”, “星期四 6/26 - 下雨 - 18/11”, “周五 6/27 - 有雾 - 21/10”, “星期六 6/28 - 被气象站困住 - 23/18”, “太阳 6/29 - 晴天 - 20/7” }; 我在代码中找不到任何其他问题,只需尝试更正数组并重新运行它。 希望能帮助到你.. 干杯。

【讨论】:

    【解决方案5】:

    我已经尝试过如图所示删除该行,如果它存在。这个你可以在 DetailActivity.java 中找到(在 android studio 1.5.1 中)

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多