0
votes

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.ZygoteInit.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.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)  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 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)  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.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.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) 

1
post the full stack tracehimel
You're not attaching the layout inflated in the inflate() call in init(), so the subsequent findViewById() calls are returning null. Either remove the false argument from inflate(), or change it to true.Mike M.
added it @himelHemalHerath
look at this ,,there is a NPE here , try to debug it ? 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) athimel

1 Answers

0
votes

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

Also you have to add the view like:

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

Here´s a popular Question about custom views