我需要帮助来修复此NPE

时间:2019-06-03 11:45:23

标签: java nullpointerexception

我正在尝试从束中适配器中的意图获取值,但似乎给了我空指针异常

我不确定,据我所知,获得额外的捆绑包是否给了我NPE,但不确定如何解决     //首先适配器     公共类ArticleAdapter扩展了RecyclerView.Adapter {

    class MyViewHolder extends RecyclerView.ViewHolder {
         TextView category;
        TextView title;
         ImageView image;
         TextView pubDate;

        MyViewHolder(View view) {
            super(view);
            title = (TextView) view.findViewById(R.id.row_title);
            image = (ImageView) view.findViewById(R.id.row_image);
            pubDate = (TextView) view.findViewById(R.id.row_pubDate);
            category = (TextView) view.findViewById(R.id.row_categories);
        }
    }
    @NotNull
    @Override
    public MyViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.row,parent, false);
        return new MyViewHolder(v);
    }


    private List<Article> articles;

    private Context mContext;
    private WebView articleView;

    public ArticleAdapter(List<Article> list, Context context) {
        this.articles = list;
        this.mContext = context;
    }

    public List<Article> getArticleList() {
        return articles;
    }


    @Override
    public void onBindViewHolder(@NonNull final MyViewHolder viewHolder, int position) {

        Article currentArticle = articles.get(position);
        Log.e("article", currentArticle.getTitle());
        String pubDateString;
        try {
            String sourceDateString = currentArticle.getPubDate();

            SimpleDateFormat sourceSdf = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
            Date date = sourceSdf.parse(sourceDateString);

            SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM yyyy", Locale.getDefault());
            pubDateString = sdf.format(date);

        } catch (ParseException e) {
            e.printStackTrace();
            pubDateString = currentArticle.getPubDate();
        }

        viewHolder.title.setText(currentArticle.getTitle());

        Picasso.get()
                .load(currentArticle.getImage())
                .placeholder(R.drawable.placeholder)
                .into(viewHolder.image);

        viewHolder.pubDate.setText(pubDateString);

        StringBuilder categories = new StringBuilder();
        for (int i = 0; i < currentArticle.getCategories().size(); i++) {
            if (i == currentArticle.getCategories().size() - 1) {
                categories.append(currentArticle.getCategories().get(i));
            } else {
                categories.append(currentArticle.getCategories().get(i)).append(", ");
            }
        }

        viewHolder.category.setText(categories.toString());

        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {

            @SuppressLint("SetJavaScriptEnabled")
            @Override
            public void onClick(View view) {
                articleView = new WebView(mContext);

                articleView.getSettings().setLoadWithOverviewMode(true);

                String title = articles.get(viewHolder.getAdapterPosition()).getTitle();
                String content = articles.get(viewHolder.getAdapterPosition()).getContent();

                articleView.getSettings().setJavaScriptEnabled(true);
                articleView.setHorizontalScrollBarEnabled(false);
                articleView.setWebChromeClient(new WebChromeClient());
                articleView.loadDataWithBaseURL(null, "<style>img{display: inline; height: auto; max-width: 100%;} " +

                        "</style>\n" + "<style>iframe{ height: auto; width: auto;}" + "</style>\n" + content, null, "utf-8", null);

                Intent intent = new Intent(mContext,DetailActivity.class);
                intent.putExtra("setTitle",title);
                intent.putExtra("setContent",content);
                mContext.startActivity(intent);
            }
        });
    }

    @Override
    public int getItemCount() {
        return articles == null ? 0 : articles.size();
    }
}
//the Activity code
public class DetailActivity extends AppCompatActivity {

    DetailFragment mDetailFragment;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);
        DetailFragment mDetailFragment = (DetailFragment)getSupportFragmentManager().findFragmentByTag("TAG");
        Intent intent = getIntent();
        Bundle bundle = intent.getExtras();
        mDetailFragment.setTitle((String) bundle.get("setTitle"));
        showDetailFragment();
    }

    private void startTransactionFragment(Fragment fragment) {
        if (!fragment.isVisible()) {
            getSupportFragmentManager().beginTransaction().add(R.id.detail_activity_frame_layout, fragment).commit();
        }
    }
    private void showDetailFragment() {
        if (this.mDetailFragment == null) this.mDetailFragment = DetailFragment.newInstance();
        this.startTransactionFragment(this.mDetailFragment);
    }
}
//the fragment code
public class DetailFragment extends Fragment {

    @BindView(R.id.detail_title) TextView title;
    @BindView(R.id.detail_content) WebView content;
    private WebView articleView;

    public DetailFragment() {   }

    public static DetailFragment newInstance () {
        return (new DetailFragment());
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view= inflater.inflate(R.layout.fragment_detail, container, false);

        ButterKnife.bind(this, view);
        return view;

    }
    public void setTitle(String s){ title.setText(s); }
    public void setContent(String s){
        articleView = new WebView(getContext());
        articleView.getSettings().setLoadWithOverviewMode(true);
        articleView.getSettings().setJavaScriptEnabled(true);
        articleView.setHorizontalScrollBarEnabled(false);
        articleView.setWebChromeClient(new WebChromeClient());
        articleView.loadDataWithBaseURL(null, "<style>img{display: inline; height: auto; max-width: 100%;} " +

                "</style>\n" + "<style>iframe{ height: auto; width: auto;}" + "</style>\n" + s, null, "utf-8", null);

    }

}
//and finally the xml code for both
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
    tools:context=".Controllers.Fragments.DetailFragment"
    android:tag="TAG">
    <TextView
        android:id="@+id/detail_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="TITLE"
        android:textSize="50dp"/>
    <WebView
        android:id="@+id/detail_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ARTICLE"
        android:textSize="20dp"
        android:layout_gravity="center"/>

</LinearLayout>
//activity xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/detail_activity_frame_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Controllers.Activities.DetailActivity">

</FrameLayout>

更新后的堆栈跟踪:

  

E / Android运行时:致命异常:主要      流程:com.example.rssreader,PID:25621      java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.rssreader / com.example.rssreader.Controllers.Activities.DetailActivity}:java.lang.NullPointerException:尝试调用虚拟方法'void com.example.rssreader。空对象引用上的Controllers.Fragments.DetailFragment.setTitle(java.lang.String)'          在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)          在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)          在android.app.ActivityThread.-wrap11(未知来源:0)          在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1589)          在android.os.Handler.dispatchMessage(Handler.java:106)          在android.os.Looper.loop(Looper.java:164)          在android.app.ActivityThread.main(ActivityThread.java:6494)          在java.lang.reflect.Method.invoke(本机方法)          在com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:438)          在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)       原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'void com.example.rssreader.Controllers.Fragments.DetailFragment.setTitle(java.lang.String)'          在com.example.rssreader.Controllers.Activities.DetailActivity.onCreate(DetailActivity.java:28)          在android.app.Activity.performCreate(Activity.java:7009)          在android.app.Activity.performCreate(Activity.java:7000)          在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)          在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)          在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)          在android.app.ActivityThread.-wrap11(未知来源:0)          在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1589)          在android.os.Handler.dispatchMessage(Handler.java:106)          在android.os.Looper.loop(Looper.java:164)          在android.app.ActivityThread.main(ActivityThread.java:6494)          在java.lang.reflect.Method.invoke(本机方法)          在com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:438)          com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

1 个答案:

答案 0 :(得分:1)

发生这种情况是因为mDetailFragment未初始化。

堆栈跟踪显示mDetailFragment = null

  

java.lang.NullPointerException:尝试调用虚拟方法'void   com.example.rssreader.Controllers.Fragments.DetailFragment.setTitle(java.lang.String)'   空的

基本上你需要做的是这个

// Let's first dynamically add a fragment into a frame container, that is your xml like a LinearLayout
         getSupportFragmentManager().beginTransaction(). 
             replace(R.id.YOUR_XML, new DetailFragment(), "SOMETAG").
             commit();
         // Now later we can lookup the fragment by tag
         DetailFragment mDetailFragment = (DetailFragment) 
             getSupportFragmentManager().findFragmentByTag("SOMETAG");

要使用片段,本教程此处显示了几种方法 Creating and Using Fragments

  

更新

将您的onCreate()更改为以下内容:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detail);
    Intent intent = getIntent();
    Bundle bundle = intent.getExtras();
    DetailFragment fragment = (DetailFragment)getSupportFragmentManager().findFragmentByTag("TAG");
    if(fragment == NULL){
        fragment = DetailFragment.newInstance();
    }
    fragment.setTitle((String) bundle.get("setTitle"));
    startTransactionFragment(fragment);
}

我还没有从头开始测试代码。