Android错误膨胀类android.support.constraint.ConstraintLayout

Posted

技术标签:

【中文标题】Android错误膨胀类android.support.constraint.ConstraintLayout【英文标题】:Android Error inflating class android.support.constraint.ConstraintLayout 【发布时间】:2017-09-08 21:37:00 【问题描述】:

当我想启动我的应用程序时,我收到错误“应用程序已停止工作。为什么我在启动应用程序时会收到此错误?

--------- 崩溃开始 04-12 18:28:12.344 8646-8646/com.example.audiophileradio.audiophileradio E/androidRuntime: 致命异常: main 进程:com.example.audiophileradio.audiophileradio,PID:8646 java.lang.RuntimeException:无法启动活动 组件信息com.example.audiophileradio.audiophileradio/com.example.audiophileradio.audiophileradio.MainActivity: android.view.InflateException:二进制 XML 文件第 2 行:错误 膨胀类 android.support.constraint.ConstraintLayout 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 在 android.app.ActivityThread.access$800(ActivityThread.java:144) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5221) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 引起:android.view.InflateException:二进制 XML 文件第 2 行: 膨胀类 android.support.constraint.ConstraintLayout 时出错 在 android.view.LayoutInflater.createView(LayoutInflater.java:633) 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:482) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:414) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:365) 在 android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:292) 在 android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140) 在 com.example.audiophileradio.audiophileradio.MainActivity.onCreate(MainActivity.java:52) 在 android.app.Activity.performCreate(Activity.java:5933) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 在 android.app.ActivityThread.access$800(ActivityThread.java:144) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5221) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 引起:java.lang.reflect.InvocationTargetException 在 java.lang.reflect.Constructor.newInstance(Native Method) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:288) 在 android.view.LayoutInflater.createView(LayoutInflater.java:607) 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:482) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:414) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:365) 在 android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:292) 在 android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140) 在 com.example.audiophileradio.audiophileradio.MainActivity.onCreate(MainActivity.java:52) 在 android.app.Activity.performCreate(Activity.java:5933) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 在 android.app.ActivityThread.access$800(ActivityThread.java:144) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5221) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 引起:java.lang.OutOfMemoryError: Failed to allocate a 147456012 1048480 空闲字节和 94MB 的字节分配,直到 OOM 在 dalvik.system.VMRuntime.newNonMovableArray(本机方法) 在 android.graphics.BitmapFactory.nativeDecodeAsset(本机方法) 在 android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609) 在 android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444) 在 android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:973) 在 android.content.res.Resources.loadDrawableForCookie(Resources.java:2423) 在 android.content.res.Resources.loadDrawable(Resources.java:2330) 在 android.content.res.TypedArray.getDrawable(TypedArray.java:749) 在 android.view.View.(View.java:3730) 在 android.view.ViewGroup.(ViewGroup.java:491) 在 android.view.ViewGroup.(ViewGroup.java:487) 在 android.view.ViewGroup.(ViewGroup.java:483) 在 android.support.constraint.ConstraintLayout.(ConstraintLayout.java:419) 在 java.lang.reflect.Constructor.newInstance(Native Method) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:288) 在 android.view.LayoutInflater.createView(LayoutInflater.java:607) 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:482) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:414) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:365) 在 android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:292) 在 android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140) 在 com.example.audiophileradio.audiophileradio.MainActivity.onCreate(MainActivity.java:52) 在 android.app.Activity.performCreate(Activity.java:5933) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 在 android.app.ActivityThread.access$800(ActivityThread.java:144) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5221) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

public class MainActivity extends AppCompatActivity


    private ImageButton buttonPlay,buttonStop,buttonPause;
    private String STREAM_URL = "http://178.149.86.162:8000/";
    private MediaPlayer mPlayer;
    Intent playbackServiceIntent;

    private SeekBar volumeSeekbar = null;
    private AudioManager audioManager = null;

    private TextView volume;
    Context context;
    NotificationManager notificationManager;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        buttonPlay = (ImageButton) findViewById(R.id.buttonPlay);

        mPlayer = new MediaPlayer();

        initControls();

        buttonPlay.setTag(1);
        buttonPlay.setImageResource(R.drawable.stop);
        buttonPlay.setOnClickListener(new OnClickListener()
        
            @Override
            public void onClick(View view)
            
                if (Integer.parseInt(buttonPlay.getTag().toString()) == 1)
                
                    buttonPlay.setImageResource(R.drawable.play);
                    view.setTag(0);
                    startService(playbackServiceIntent);
                    Log.e("Play", "onPlay");
                    Toast.makeText(MainActivity.this, "Play", Toast.LENGTH_SHORT).show();
                    showNotification();
                
                else
                
                    buttonPlay.setImageResource(R.drawable.stop);
                    view.setTag(1);
                    mPlayer.stop();
                    stopService(playbackServiceIntent);
                    Log.e("Stop", "onPlay");
                    Toast.makeText(MainActivity.this, "Stop", Toast.LENGTH_SHORT).show();
                

            
        );

        volume = (TextView) findViewById(R.id.textView);
        volume.setText("Volume :" + volumeSeekbar.getProgress());

        playbackServiceIntent = new Intent(this, BackgroundService.class);
    

    private void startService()
    
        startService(new Intent(MainActivity.this,BackgroundService.class));
    
    private void stopService()
    
        stopService(new Intent(MainActivity.this,BackgroundService.class));
    

    private void initControls()
    
        try
        
            volumeSeekbar = (SeekBar)findViewById(R.id.seekBar);
            audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
            volumeSeekbar.setMax(audioManager
                    .getStreamMaxVolume(AudioManager.STREAM_MUSIC));
            volumeSeekbar.setProgress(audioManager
                    .getStreamVolume(AudioManager.STREAM_MUSIC));

            volumeSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
            
                @Override
                public void onStopTrackingTouch(SeekBar arg0)
                
                

                @Override
                public void onStartTrackingTouch(SeekBar arg0)
                
                

                @Override
                public void onProgressChanged(SeekBar arg0, int progress, boolean arg2)
                
                    audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,
                            progress, 0);

                    volume.setText("Volume : " + progress + "%");
                
            );
        
        catch (Exception e)
        
            e.printStackTrace();
        
    

    @Override
    public void onBackPressed()
    
        new AlertDialog.Builder(this)
                .setIcon(android.R.drawable.ic_dialog_alert)
                .setTitle("Audiophile Radio")
                .setMessage("Are you sure you want to close this activity?")
                .setPositiveButton("Yes", new DialogInterface.OnClickListener()
                
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    
                        finish();
                    

                )
                .setNegativeButton("No", null)
                .show();
    

    private void showNotification()
    
        Intent intent = new Intent();
        PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,0,intent,0);
        Notification builder = new Notification.Builder(MainActivity.this)
                .setTicker("Audiophile Radio")
                .setContentTitle("Audiophile Radio")
                .setContentText("DeeJay Z1an")
                .setSmallIcon(R.drawable.play)
                .addAction(R.drawable.play,"play",pendingIntent)
                .setContentIntent(pendingIntent).getNotification();

        builder.flags=Notification.FLAG_AUTO_CANCEL;
        notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        notificationManager.notify(0,builder);
    

    public static void cancelNotification(Context ctx, int notifyId) 
        String ns = Context.NOTIFICATION_SERVICE;
        NotificationManager nMgr = (NotificationManager) ctx.getSystemService(ns);
        nMgr.cancel(notifyId);
    




public class BackgroundService extends Service implements OnCompletionListener

    MediaPlayer mediaPlayer;
    private String STREAM_URL = "http://178.149.86.162:8000/";

    @Override
    public IBinder onBind(Intent intent) 
        return null;
    

    @Override
    public void onCreate()
    
        mediaPlayer = new MediaPlayer();
        try
        
            mediaPlayer.setDataSource(STREAM_URL);
         catch (IOException e)
        
            e.printStackTrace();
        

        mediaPlayer.setOnCompletionListener(this);
    

    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    

        if (!mediaPlayer.isPlaying())
        
            try
            
                mediaPlayer.reset();
                mediaPlayer.setDataSource(STREAM_URL);
                mediaPlayer.prepareAsync();

                mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener()
                
                    @Override
                    public void onPrepared(MediaPlayer mp)
                    
                        mediaPlayer.start();
                    
                );
             catch (IOException e)
            
                e.printStackTrace();
            

        

        return START_STICKY;
    

    public void onDestroy() 
        if (mediaPlayer.isPlaying()) 
            mediaPlayer.stop();
        
        mediaPlayer.release();
    

    public void onCompletion(MediaPlayer _mediaPlayer) 
        stopSelf();
    


    @Override
    public boolean onUnbind(Intent intent)
    
        return super.onUnbind(intent);
    

【问题讨论】:

我已经解决了问题。问题是背景,太大了!!! 你是怎么解决这个问题的? 【参考方案1】:

检查您的 build.gradle 文件,确保添加了以下依赖项

compile 'com.android.support.constraint:constraint-layout:1.0.2'

【讨论】:

超级!我的build.gradle 显示implementation 'com.android.support.constraint:constraint-layout:1.0.2'。我刚刚将implementation 更改为compile,它就像一个魅力。 compile 现已弃用,应替换为 implementation 或 api【参考方案2】:

在 gradle 文件中添加实现 'com.android.support.constraint:constraint-layout:1.0.2'

【讨论】:

【参考方案3】:

迁移到 androidx 后出现此错误:系统已将 build.gradle 条目更改为 androidx 库但未更改 xml 文件。手动将 xml 开始标记更改为相关的 androidx 名称解决了它。

【讨论】:

以上是关于Android错误膨胀类android.support.constraint.ConstraintLayout的主要内容,如果未能解决你的问题,请参考以下文章

Android错误膨胀类android.support.constraint.ConstraintLayout

Android 应用程序停止错误:膨胀类 android.widget.ListView

错误:膨胀类 com.google.android.material.textfield.TextInputLayout

android.view.InflateException Binary xml 文件第 11 行:错误膨胀类片段

Android:二进制 XML 文件行错误膨胀类

错误:膨胀类 com.google.android.material.navigation.NavigationView