![](/img/trans.png)
[英]FATAL Exception:java.lang.RuntimeException: Unable to start activity 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.