简体   繁体   中英

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

I have created 3 tabs similar to snap chat application. my main activity like below:

<?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>

In my view_snap_tabs.xml file like below but when I include this as a view in activity_main.xml file nothings showing

<?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>

and I have created a class for control the view_snap_tabs.xml becasuse I want to make changes it slide throw each fragment

and In my MainActivity.java class I have Include like below

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

and My SnapTabView.java class like below

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);
}
}

Why viewsnaptabs not showing in activity_main.xml file

if I run that Im getting a error like below

FATAL EXCEPTION: main Process: com.example.crowderia.chat, PID: 13383 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.crowderia.chat/com.example.crowderia.chat.MainActivity}: android.view.InflateException: Binary XML file line #0: Error inflating class com.example.crowderia.chat.view.SnapTabView at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2594) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2685) at android.app.ActivityThread.access$900(ActivityThread.java:188) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1530) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:210) at android.app.ActivityThread.main(ActivityThread.java:5839) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1113) at com.android.internal.os.Zygote Init.main(ZygoteInit.java:879) Caused by: android.view.InflateException: Binary XML file line #0: Error inflating class com.example.crowderia.chat.view.SnapTabView at android.view.LayoutInflater.createView(LayoutInflater.java:633) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743) at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) at android.view.LayoutInflater.inflate(LayoutInflater.java:504) at android.view.LayoutInflater.inflate(LayoutInflater.java:414) at android.view.LayoutInflater.inflate(LayoutInflater.java:365) at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:287) at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139) at com.example.crowderia.chat.MainActivity.onCreate(MainActivity.java:26) at android.app.Activity.performCreate(Activity.java:6177) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1112) at android.app.ActivityThread.performLaun chActivity(ActivityThread.java:2541) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2685) at android.app.ActivityThread.access$900(ActivityThread.java:188) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1530) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:210) at android.app.ActivityThread.main(ActivityThread.java:5839) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1113) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:879) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.newInstance(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:288) at android.view.LayoutInflater.createView(LayoutInflater.java:607) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743) at a ndroid.view.LayoutInflater.rInflate(LayoutInflater.java:806) at android.view.LayoutInflater.inflate(LayoutInflater.java:504) at android.view.LayoutInflater.inflate(LayoutInflater.java:414) at android.view.LayoutInflater.inflate(LayoutInflater.java:365) at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:287) at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139) at com.example.crowderia.chat.MainActivity.onCreate(MainActivity.java:26) at android.app.Activity.performCreate(Activity.java:6177) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1112) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2541) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2685) at android.app.ActivityThread.access$900(ActivityThread.java:188) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1530) at android.os.Handler.dispatchMessage(Handle r.java:111) at android.os.Looper.loop(Looper.java:210) at android.app.ActivityThread.main(ActivityThread.java:5839) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1113) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:879) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.ViewTreeObserver android.widget.ImageView.getViewTreeObserver()' on a null object reference at com.example.crowderia.chat.view.SnapTabView.init(SnapTabView.java:58) at com.example.crowderia.chat.view.SnapTabView.(SnapTabView.java:45) at com.example.crowderia.chat.view.SnapTabView.(SnapTabView.java:0) at java.lang.reflect.Constructor.newInstance(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:288) at android.view.LayoutInflater.createView(LayoutInflater.java:607) at android.view.LayoutInflater.createV iewFromTag(LayoutInflater.java:743) at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) at android.view.LayoutInflater.inflate(LayoutInflater.java:504) at android.view.LayoutInflater.inflate(LayoutInflater.java:414) at android.view.LayoutInflater.inflate(LayoutInflater.java:365) at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:287) at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139) at com.example.crowderia.chat.MainActivity.onCreate(MainActivity.java:26) at android.app.Activity.performCreate(Activity.java:6177) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1112) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2541) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2685) at android.app.ActivityThread.access$900(ActivityThread.java:188) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1530) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:210) at android.app.ActivityThread.main(ActivityThread.java:5839) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1113) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:879)

I Guess you have to put the init(); also in the other two constructors. That will maybe not solve this problem but it´sa start.

Also you have to add the view like:

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

Here´sa popular Question about custom views

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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