繁体   English   中英

致命异常:java.lang.RuntimeException:无法启动活动ComponentInfo?

[英]FATAL EXCEPTION: java.lang.RuntimeException: Unable to start activity ComponentInfo?

我已经创建了3个类似于快照聊天应用程序的标签。 我的主要活动如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.crowderia.chat.MainActivity"
    android:background="@android:color/transparent">

    <FrameLayout
        android:id="@+id/camera_preview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/black"/>

    <View
        android:id="@+id/am_background_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:alpha=".5"/>

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <com.example.crowderia.chat.view.SnapTabView
        android:id="@+id/am_snap_tabs"
        android:layout_alignParentBottom="true"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:layout_marginBottom="16dp"/>

</RelativeLayout>

在我的view_snap_tabs.xml文件中,如下所示,但是当我将其作为一个视图包含在activity_main.xml文件中时,什么也没有显示

<?xml version="1.0" encoding="utf-8"?>
<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="184dp"
    tools:layout_gravity="bottom"
    tools:background="@color/light_purple"
    android:id="@+id/snaps">

    <ImageView
        android:id="@+id/vst_center_image"
        android:layout_width="88dp"
        android:layout_height="88dp"
        android:layout_gravity="center|bottom"
        android:src="@drawable/large_circle"
        android:layout_marginBottom="96dp"/>

    <ImageView
        android:id="@+id/vst_start_image"
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:layout_marginBottom="56dp"
        android:layout_marginStart="24dp"
        android:layout_gravity="start|bottom"
        android:src="@drawable/ic_chat_bubble_24dp"/>

    <ImageView
        android:id="@+id/vst_end_image"
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:layout_marginBottom="56dp"
        android:layout_marginEnd="24dp"
        android:layout_gravity="end|bottom"
        android:src="@drawable/ic_group_work_24dp"/>

    <ImageView
        android:id="@+id/vst_bottom_image"
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:layout_marginBottom="48dp"
        android:layout_gravity="center|bottom"
        android:src="@drawable/small_circle"/>

    <View
        android:id="@+id/vst_indicator"
        android:layout_width="48dp"
        android:layout_height="4dp"
        android:layout_gravity="bottom|center"
        android:layout_marginBottom="44dp"
        android:background="@drawable/indicator_background"/>

</FrameLayout>

并且我创建了一个用于控制view_snap_tabs.xml的类,因为我想对其进行更改以使其滑动并抛出每个片段

在我的MainActivity.java类中,我具有Include,如下所示

SnapTabView snapTabView = (SnapTabView) findViewById(R.id.am_snap_tabs);
snapTabView.setUpWithViewPager(viewPager);

和我的SnapTabView.java类,如下所示

public class SnapTabView extends FrameLayout implements ViewPager.OnPageChangeListener {

private ImageView mCenterImage;
private ImageView mStartImage;
private ImageView mBottomImage;
private ImageView mEndImage;
private View mIndicator;
private ArgbEvaluator mArgbEvaluator;
private int mCenterColor;
private int mSideColor;
private int mEndViewsTranslationX;
private int mIndicatorTranslationX;
private int mCenterTransationY;

public SnapTabView(@NonNull Context context) {
    this(context, null);
}
public SnapTabView(@NonNull Context context, @Nullable AttributeSet attrs) {
    this(context, attrs, 0);
}
public SnapTabView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}
private void init() {
    LayoutInflater.from(getContext()).inflate(R.layout.view_snap_tabs, this, false);
    mCenterImage = (ImageView) findViewById(R.id.vst_center_image);
    mBottomImage = (ImageView) findViewById(R.id.vst_bottom_image);
    mEndImage = (ImageView) findViewById(R.id.vst_end_image);
    mStartImage = (ImageView) findViewById(R.id.vst_start_image);
    mIndicator = (View) findViewById(R.id.vst_indicator);
    mCenterColor = ContextCompat.getColor(getContext(), R.color.white);
    mSideColor = ContextCompat.getColor(getContext(), R.color.dark_grey);
    mArgbEvaluator = new ArgbEvaluator();
    mIndicatorTranslationX = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 80, getResources().getDisplayMetrics());
    mBottomImage.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            mEndViewsTranslationX = (int) ((mBottomImage.getX() - mStartImage.getX()) - mIndicatorTranslationX);
            mBottomImage.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            mCenterTransationY = getHeight() - mBottomImage.getBottom();
        }
    });
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    if(position == 0) {
        setColor(1 - positionOffset);
        moveViews(1 - positionOffset);
        mIndicator.setTranslationX((positionOffset - 1) * mIndicatorTranslationX);
        moveAndScaleCenter(1 - positionOffset);

    } else if(position == 1) {
        setColor(positionOffset);
        moveViews(positionOffset);
        mIndicator.setTranslationX(positionOffset * mIndicatorTranslationX);
        moveAndScaleCenter(positionOffset);

    }
}
public void setUpWithViewPager(final ViewPager viewPager) {
    viewPager.addOnPageChangeListener(this);
    mStartImage.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            if(viewPager.getCurrentItem() != 0)
                viewPager.setCurrentItem(0);
        }
    });
    mEndImage.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            if(viewPager.getCurrentItem() != 2)
                viewPager.setCurrentItem(2);
        }
    });
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
private void setColor(float fractionFromCenter) {
    int color = (int) mArgbEvaluator.evaluate(fractionFromCenter, mCenterColor, mSideColor);
    mCenterImage.setColorFilter(color);
    mStartImage.setColorFilter(color);
    mEndImage.setColorFilter(color);
}

private void moveViews(float fractionFromCenter) {
    mStartImage.setTranslationX(fractionFromCenter * mEndViewsTranslationX);
    mEndImage.setTranslationX(-fractionFromCenter * mEndViewsTranslationX);
    mIndicator.setAlpha(fractionFromCenter);
    mIndicator.setScaleX(fractionFromCenter);
}

private void moveAndScaleCenter(float fractionFromCenter) {
    float scale = .7f + ((1 - fractionFromCenter) * .3f);
    mCenterImage.setScaleX(scale);
    mCenterImage.setScaleY(scale);
    int translation = (int) (fractionFromCenter * mCenterTransationY);
    mCenterImage.setTranslationY(translation);
    mBottomImage.setTranslationY(translation);
    mBottomImage.setAlpha(1 - fractionFromCenter);
}
}

为什么viewsnaptabs没有显示在activity_main.xml文件中

如果我运行我得到如下错误

致命异常:主进程:com.example.crowderia.chat,PID:13383 java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.crowderia.chat/com.example.crowderia.chat.MainActivity}:android。 view.InflateException:二进制XML文件第0行:错误膨胀com.example.crowderia.chat.view.SnapTabView类,位于android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2594),位于android.app.ActivityThread.handleLaunchActivity(ActivityThread .java:2685),位于android.app.ActivityThread.access $ 900(ActivityThread.java:188),位于android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1530),位于android.os.Handler.dispatchMessage(Handler.java Java的java.lang.reflect.Method.invoke(Native Method)的android.os.Looper.loop(Looper.java:210)的android.os.Looper.loop(Looper.java:210)。 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1113)处的lang.reflect.Method.invoke(Method.java:372)在com.android.internal.os.Zygote处 Init.main(ZygoteInit.java:879)原因:android.view.InflateException:二进制XML文件第0行:在android.view.LayoutInflater.createView(LayoutInflater)上膨胀类com.example.crowderia.chat.view.SnapTabView时出错.java:633),位于android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743),位于android.view.LayoutInflater.rInflate(LayoutInflater.java:806),位于android.view.LayoutInflater.inflate(LayoutInflater.java:504)在android.view.LayoutInflater.inflate(LayoutInflater.java:414)在android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:287)在android.view.LayoutInflater.inflate(LayoutInflater.java:365) com.example.crowderia.chat.MainActivity.onCreate(MainActivity.java:26)上的android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)在android.app.Activity.performCreate(Activity.java: 6177),位于android.app.ActivityThread.performLaun,位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1112) android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2685)的chActivity(ActivityThread.java:2541),android.app.ActivityThread $ H.handleMessage()的android.app.ActivityThread.access $ 900(ActivityThread.java:188) android.os.Handler.dispatchMessage(Handler.java:111)的ActivityThread.java:1530)android.app.ActivityThread.main(ActivityThread.java:5839)的android.os.Looper.loop(Looper.java:210) ),位于com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java)的java.lang.reflect.Method.invoke(Method.java:372)处的java.lang.reflect.Method.invoke(本机方法) :1113)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:879)由以下原因引起:java.lang.reflect.Constructor.newInstance(本机方法)处的java.lang.reflect.InvocationTargetException .reflect.Constructor.newInstance(Constructor.java:288)在android.view.LayoutInflater.createView(LayoutInflater.java:607)在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)在 ndroid.view.LayoutInflater.rInflate(LayoutInflater.java:806)在android.view.LayoutInflater.inflate(LayoutInflater.java:504)在android.view.LayoutInflater.inflate(LayoutInflater.java:414)在android.view.LayoutInflater com上的android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:287)的.inflate(LayoutInflater.java:365)在com的android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)上。 example.crowderia.chat.MainActivity.onCreate(MainActivity.java:26)在android.app.Activity.performCreate(Activity.java:6177)在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1112)在android.app .ActivityThread.performLaunchActivity(ActivityThread.java:2541)在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2685)在android.app.ActivityThread.access $ 900(ActivityThread.java:188)在android.app.ActivityThread $ H .handleMessage(ActivityThread.java:1530)位于android.os.Handler.dispatchMessage(Handle android.os.Looper.loop(Looper.java:210)处的r.java:111)android.app.ActivityThread.main(ActivityThread.java:5839)处的java.lang.reflect.Method.invoke(本机方法)在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1113)处的com.android.internal.os.ZygoteInit.main处的java.lang.reflect.Method.invoke(Method.java:372) (ZygoteInit.java:879)原因:java.lang.NullPointerException:尝试在com.example.crowderia.chat上的空对象引用上调用虚拟方法'android.view.ViewTreeObserver android.widget.ImageView.getViewTreeObserver()'。 com.example.crowderia.chat.view.SnapTabView。(SnapTabView.java:45)上的.view.SnapTabView.init(SnapTabView.java:58)com.example.crowderia.chat.view.SnapTabView。(SnapTabView.java) :0)位于java.lang.reflect.Constructor.newInstance(本机方法)位于android.view.LayoutInflater.createView(LayoutInflater.java:607)处的java.lang.reflect.Constructor.newInstance(Constructor.java:288) android.view.LayoutInflater.createV android.view.LayoutInflater.rInflate(LayoutInflater.java:806)的iewFromTag(LayoutInflater.java:743)android.view.LayoutInflater.inflate(LayoutInflater.java)的android.view.LayoutInflater.inflate(LayoutInflater.java:504) :414),位于android.view.LayoutInflater.inflate(LayoutInflater.java:365),位于android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:287),位于android.support.v7.app.AppCompatActivity.setContentView( com.example.crowderia.chat.MainActivity.onCreate(MainActivity.java:26)的com.example.crowderia.chat.MainActivity.onCreate(MainActivity.java:26)的android.app.Instrumentation.callActivityOnCreate(Instrumentation .java:1112),位于android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2541),位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2685),位于android.app.ActivityThread.access $ 900(ActivityThread.java:188) ),位于android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1530) android.app.ActivityThread.main(ActivityThread.java:5839)处的android.os.Looper.loop(Looper.java:210)处的android.os.Handler.dispatchMessage(Handler.java:111)在java.lang.reflect com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1113)的java.lang.reflect.Method.invoke(Method.java:372)的.Method.invoke(本机方法) .internal.os.ZygoteInit.main(ZygoteInit.java:879)

我猜你必须把init(); 在其他两个构造函数中也是如此。 那也许不会解决这个问题,但这是一个开始。

另外,您还必须添加如下视图:

View view = inflate(getContext(), R.layout.my_view_layout, null);
addView(view);

这是一个关于自定义视图的热门问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM