【问题标题】:Fragment class not found未找到片段类
【发布时间】:2017-01-11 23:05:54
【问题描述】:

我刚刚开始开发我的第一个 Android 应用程序,我的重点是应用程序的主要活动,MathleteIDActivity,其中包括一个片段 TextFragment,它显示一些文本。

项目构建良好,但应用启动后立即崩溃。这发生在运行 Android 4.x.x 的两部不同的手机上,因此片段支持不应该是问题。 adb logcat 的堆栈跟踪如下所示(包已编辑):

java.lang.RuntimeException:无法启动活动 ComponentInfo{foo.bar.baz.id.MathleteIDActivity} ... ... 原因:android.view.InflateException: Binary XML file line #12: Error inflating class fragment ... 引起:android.app.Fragment$InstantiationException:无法实例化片段.fragments.TextFragment:确保类名存在,是公共的,并且有一个公共的空构造函数 ... 引起:java.lang.ClassNotFoundException:.fragments.TextFragment ...

我的目录结构看起来很干净:我在项目根目录中的 src/main/java/ 和那个包中都有包目录 foo/bar/baz/

碎片/ 文本片段.java ID/ NFCIDActivity.java MathleteIDActivity.java ... ...

MathleteIDActivity.java 内容如下:

package foo.bar.baz.id;

import android.widget.TextView;
import android.os.Bundle;
import foo.bar.baz.R;

public final class MathleteIDActivity extends NFCIDActivity {
    @Override
    public void onCreate(Bundle savedState) {
        super.onCreate(savedState);
        TextView textView = (TextView) findViewById(R.id.fragment_text);
        textView.setText("Scan mathlete tag");
    }
}

NFCIDActivity 是一个抽象类,扩展了 Android 的 Activity。它唯一的方法是覆盖onCreate

@Override
public void onCreate(Bundle savedState) {
    super.onCreate(savedState);
    setContentView(R.layout.id_activity);
}

TextFragment.java 内容如下:

package foo.bar.baz.fragments;

import android.app.Fragment;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.LayoutInflater;
import foo.bar.baz.R;

public final class TextFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.text_fragment, container, false);
    }
}

src/main/res/layout/id_activity.xml 我定义了活动布局:

<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <fragment
        android:name=".fragments.TextFragment"
        android:id="@+id/id_message" >
    </fragment>
</LinearLayout>

在同一目录下,text_fragment.xml 定义了TextFragment 的布局:

<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <TextView
        android:id="@+id/fragment_text"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </TextView>
</LinearLayout>

我已经试过了:

  • TextFragment 添加一个公共的、无参数的构造函数。同样的错误。
  • 通过完全限定的包名称foo.bar.baz.fragments.TextFragment 引用布局文件中的片段。同样的错误,现在命名新包。
  • TextFragment 的源文件移动到顶级包foo.bar.baz 并调整引用。同样的错误,现在命名新包。

有什么想法吗?

【问题讨论】:

  • 我们可以看到您的 MathleteIDActivity.java 和 TextFragment.java 的代码吗?另外,你的片段有自己的布局吗?
  • 是的。我已经添加了该信息。
  • 你能发布你的build.gradle吗?您是否尝试过使用FragmentManager 以编程方式实例化您的片段?如果是这样,你会得到同样的错误吗?
  • 看看build.gradlehere。我不熟悉FragmentManager,但我会调查并发布更新。
  • @KarsenGauss 有趣的是,以编程方式创建和添加片段工作正常。

标签: java android android-fragments


【解决方案1】:

使用FragmentManager 作为快速解决方案以编程方式实例化您的片段:

FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();

TextFragment tf = new TextFragment();
ft.replace(R.id.container, tf);
ft.commit();

至于您的方法,请改用规范的包名称并干净构建您的项目。然后注意错误信息(它不能是“相同的错误”,因为它至少应该提到不同的包名称)。

【讨论】:

  • 错误消息中引用的包确实发生了变化。完全限定的包名称加上干净的构建解决了这个问题。
  • 这是Java解决方案,当然,但是使用Fragment的XML方法呢?
【解决方案2】:

对我来说,我使用的是导航图,当导航到我的设置片段时,它因错误而崩溃 - 片段类未设置。我必须转到导航图代码并输入片段类的 android:name 属性,即 com.example.company.features.Settings

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2013-09-20
    相关资源
    最近更新 更多