【问题标题】:onClick on Cardview get from firebaseonClick Cardview 从 firebase 获取
【发布时间】:2017-10-30 17:28:12
【问题描述】:

我是在我的新闻浏览器上这样做的:

    public class NewsViewHolder extends RecyclerView.ViewHolder {

    View mView;
    Context context;

    public NewsViewHolder(final View itemView) {
        super(itemView);
        mView = itemView;
        itemView.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                Intent intent = new Intent(view.getContext(), DetalleFragment.class);
                view.getContext().startActivity(intent);
            }
        });
    }

    public void setTitular(String titular) {
        TextView post_titular = (TextView) mView.findViewById(R.id.titleText);
        post_titular.setText(titular);
    }

    public void setImage(Context ctx, String image){
        ImageView post_image = (ImageView) mView.findViewById(R.id.imageView);
        Picasso.with(ctx).load(image).into(post_image);
    }
}

当我在卡片视图中执行 onClick 时,它会引发下一个错误:

E/AndroidRuntime:致命异常:主进程: es.laramira.atellez.moroninfo,PID:5200 android.content.ActivityNotFoundException:找不到显式 活动课 {es.laramira.atellez.moroninfo/es.laramira.atellez.moroninfo.Fragments.DetalleFragment}; 您是否在 AndroidManifest.xml 中声明了此活动?在 android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1805) 在 android.app.Instrumentation.execStartActivity(Instrumentation.java:1523) 在 android.app.Activity.startActivityForResult(Activity.java:4224) 在 android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50) 在 android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79) 在 android.app.Activity.startActivityForResult(Activity.java:4183) 在 android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859) 在 android.app.Activity.startActivity(Activity.java:4507) 在 android.app.Activity.startActivity(Activity.java:4475) 在 es.laramira.atellez.moroninfo.Models.NewsViewHolder$1.onClick(NewsViewHolder.java:32) 在 android.view.View.performClick(View.java:5610) 在 android.view.View$PerformClick.run(View.java:22265) 在 android.os.Handler.handleCallback(Handler.java:751) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6077) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

我在我的 AndroidManifest.xml 中定义了新的活动,但我不知道如何解决这个问题......

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="es.laramira.atellez.moroninfo">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".ActivityDetalle"></activity>
    </application>

</manifest>

我尝试了很多在 Stackoverflow 和其他网站上找到的答案,但我无法解决这个问题......

【问题讨论】:

  • 您正在尝试将 Fragment 作为 Activity 启动(这似乎是一个名为 DetlleFragment.class 的 Fragment)。这行不通,异常说明了问题。如果你只是想用 Fragment 的布局启动一个 Activity,在这种情况下创建一个 Activity 并使用 Fragment 的布局。

标签: android nullpointerexception


【解决方案1】:

您正在启动 Fragment,而不是您的 Activity。

new Intent(view.getContext(), DetalleFragment.class);

但你不能对片段使用 context.startActivity。

如果你想开始你的“ActivityDetalle”,正如我在你的 清单,将调用替换为

new Intent(view.getContext(), ActivityDetalle.class);

编辑:

如果你想从一个不属于 一个活动,你必须添加意图标志Intent.FLAG_ACTIVITY_NEW_TASK

【讨论】:

    【解决方案2】:

    通过调用像

    这样的构造函数来初始化适配器中的上下文
    public MyAdapter(Context c) {
            this.c=c;
    

    }

    并在您初始化适配器时调用您的活动中的构造函数

    MyAdapter adaoter = new MyAdapter(this);
    

    这样你的上下文就不会是空的!

    【讨论】:

    • 我做了这个并且它抛出了另一个错误:java.lang.RuntimeException: Unable to start activity ComponentInfo
    • 在您将适配器与回收站视图绑定的活动中初始化适配器变量
    • 我初始化它使用:'MyAdapter adapter = new MyAdapter(this); RecyclerView rv = (RecyclerView) findViewById(R.id.news_list); rv.setAdapter(适配器); ' 它抛出同样的错误:java.lang.RuntimeException: Unable to start activity ComponentInfo
    • 确保你已经在你的适配器类中实现了一个参数化的构造函数,就像我在答案中解释的那样。并传递您将在该构造函数中使用的值
    【解决方案3】:

    您的Context c; 从未被初始化,所以

    View v= LayoutInflater.from(c).inflate(R.layout.activity_detalle,parent,false);
                return new NewsViewHolder(v);
    

    返回null

    更新。

    据我了解,您只想将 onClickListener 分配给一个项目。

    创建和设置另一个适配器不会解决您的问题。我会说这是完全错误的方式。

    要将onClickListener 添加到您的卡片中,您需要编辑NewsViewHolder

    public NewsViewHolder(View itemView) {
    ...
    itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //your stuff
        }
    ...
    });
    

    更新。

    不幸的是,stackoverflow 是一个您可以获得具体问题答案的地方,而不是“我插入了一些代码,它仍然无法正常工作”。这是浪费时间。 首先你必须学会​​阅读logs and debug

    以下是一些资源:

    https://www.udacity.com/course/developing-android-apps--ud853 https://commonsware.com/Android/

    【讨论】:

    • 如何初始化它??我制作了一个带有参数上下文的构造函数。但是我抛出了同样的错误
    • 检查您的视图是否在onCreateViewHolder中被夸大而不是null
    • 实现适配器时应用程序无法停止
    • 你的意思是初始化你的适配器类有异常吗?
    • 您在 Nikhya 的回答下只提供了例外的开头。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多