I am trying to add a player using Sliding Up Panel but the app crashes on startup. If you want to see my full code; https://github.com/Kailash8460/poptune.git
MainActivity.java
package com.example.poptunemusicplayerapplication; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import android.Manifest; import android.content.pm.PackageManager; import android.os.Bundle; import com.example.poptunemusicplayerapplication.fragments.MainFragment; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import com.sothree.slidinguppanel.SlidingUpPanelLayout; public class MainActivity extends AppCompatActivity { private static final int KEY_PER = 123; private SlidingUpPanelLayout panelLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, KEY_PER); return; } else { UiInitialize(); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode){ case KEY_PER: if (grantResults[0] == PackageManager.PERMISSION_GRANTED){ UiInitialize(); } default: super.onRequestPermissionsResult(requestCode, permissions, grantResults); } } private void UiInitialize() { ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(this)); panelLayout = (SlidingUpPanelLayout) findViewById(R.id.sliding_layout); Fragment fragment = new MainFragment(); FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.replace(R.id.main_container, fragment); transaction.commit(); /*List<Song> songList = new SongLoader().getAllSongs(this); for (Song song : songList){ Log.i("DATA","Title:" + song.title); }*/ } }
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <com.sothree.slidinguppanel.SlidingUpPanelLayout 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:id="@+id/sliding_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="bottom" app:umanoPanelHeight="68dp" app:umanoShadowHeight="4dp" tools:context=".MainActivity"> <FrameLayout android:id="@+id/main_container" android:layout_width="match_parent" android:layout_height="match_parent" /> <FrameLayout android:id="@+id/control_container" android:layout_width="match_parent" android:layout_height="match_parent"/> </com.sothree.slidinguppanel.SlidingUpPanelLayout>
MainFragment.java Here there is no issue on SongsFragment, ArtistFragment and AlbumFragment files, because I have run this application before adding the sliding up panel and that was successfully run but after adding this Sliding Up Panel application crashes on startup.
package com.example.poptunemusicplayerapplication.fragments; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; import androidx.viewpager.widget.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.example.poptunemusicplayerapplication.R; import com.google.android.material.tabs.TabLayout; import java.util.ArrayList; import java.util.List; public class MainFragment extends Fragment { private Toolbar toolbar; private TabLayout tabLayout; private ViewPager viewPager; public MainFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_main, container, false); toolbar = (Toolbar) rootView.findViewById(R.id.toolbar); ((AppCompatActivity)getActivity()).setSupportActionBar(toolbar); tabLayout = (TabLayout) rootView.findViewById(R.id.tabs); viewPager = (ViewPager) rootView.findViewById(R.id.view_pager); setUpViewPager(viewPager); tabLayout.setupWithViewPager(viewPager); return rootView; } private void setUpViewPager(ViewPager viewPager) { FragmentAdapter adapter = new FragmentAdapter(getActivity().getSupportFragmentManager()); adapter.AddFragments(new SongsFragment(), "Songs"); adapter.AddFragments(new ArtistFragment(), "Artist"); adapter.AddFragments(new AlbumFragment(), "Album"); viewPager.setAdapter(adapter); } private class FragmentAdapter extends FragmentPagerAdapter { private List<Fragment> fragmentList = new ArrayList<>(); private List<String> titleList = new ArrayList<>(); public FragmentAdapter(@NonNull FragmentManager fm) { super(fm); } @NonNull @Override public Fragment getItem(int position) { return fragmentList.get(position); } @Override public int getCount() { return fragmentList.size(); } public void AddFragments(Fragment fragment, String title) { fragmentList.add(fragment); titleList.add(title); } @Nullable @Override public CharSequence getPageTitle(int position) { return titleList.get(position); } } }
fragment_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayout 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:id="@+id/fragmentmainlist" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".fragments.MainFragment"> <com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/appbar" android:fitsSystemWindows="true" android:theme="@style/ThemeOverlay.AppCompat.Dark"> <androidx.appcompat.widget.Toolbar android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:id="@+id/toolbar" app:layout_scrollFlags="scroll|enterAlways" android:background="?attr/colorPrimary" app:popupTheme="@style/Theme.AppCompat.Light"/> <com.google.android.material.tabs.TabLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tabs"/> </com.google.android.material.appbar.AppBarLayout> <androidx.viewpager.widget.ViewPager android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/view_pager" app:layout_behavior="@string/appbar_scrolling_view_behavior"/> </androidx.coordinatorlayout.widget.CoordinatorLayout>
Errors
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.poptunemusicplayerapplication, PID: 28426 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.poptunemusicplayerapplication/com.example.poptunemusicplayerapplication.MainActivity}: android.view.InflateException: Binary XML file line #14: Binary XML file line #14: Error inflating class com.sothree.slidinguppanel.SlidingUpPanelLayout at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2988) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3073) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1734) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:7025) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:441) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408) Caused by: android.view.InflateException: Binary XML file line #14: Binary XML file line #14: Error inflating class com.sothree.slidinguppanel.SlidingUpPanelLayout Caused by: android.view.InflateException: Binary XML file line #14: Error inflating class com.sothree.slidinguppanel.SlidingUpPanelLayout Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.newInstance0(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:334) at android.view.LayoutInflater.createView(LayoutInflater.java:647) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730) at android.view.LayoutInflater.inflate(LayoutInflater.java:492) at android.view.LayoutInflater.inflate(LayoutInflater.java:423) at android.view.LayoutInflater.inflate(LayoutInflater.java:374) at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:706) at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:195) at com.example.poptunemusicplayerapplication.MainActivity.onCreate(MainActivity.java:39) at android.app.Activity.performCreate(Activity.java:7258) at android.app.Activity.performCreate(Activity.java:7249) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1222) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2941) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3073) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1734) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:7025) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:441) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408) Caused by: java.lang.IllegalArgumentException: gravity must be set to either top or bottom at com.sothree.slidinguppanel.SlidingUpPanelLayout.setGravity(SlidingUpPanelLayout.java:366) at com.sothree.slidinguppanel.SlidingUpPanelLayout.<init>(SlidingUpPanelLayout.java:288) at com.sothree.slidinguppanel.SlidingUpPanelLayout.<init>(SlidingUpPanelLayout.java:270) at java.lang.reflect.Constructor.newInstance0(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:334) at android.view.LayoutInflater.createView(LayoutInflater.java:647) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730) at android.view.LayoutInflater.inflate(LayoutInflater.java:492) at android.view.LayoutInflater.inflate(LayoutInflater.java:423) at android.view.LayoutInflater.inflate(LayoutInflater.java:374) at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:706) at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:195) at com.example.poptunemusicplayerapplication.MainActivity.onCreate(MainActivity.java:39) at android.app.Activity.performCreate(Activity.java:7258) at android.app.Activity.performCreate(Activity.java:7249) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1222) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2941) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3073) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1734) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:7025) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:441) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
getting error at MainActivity.java:39
Line 39 of MainActivity.java:-
setContentView(R.layout.activity_main);
Advertisement
Answer
After looking at the layout in the demo app for SlidingUpPanelLayout, I see it is expecting the android:gravity attribute to be set, not android:layout_gravity.
Try this instead for your layout:
<?xml version="1.0" encoding="utf-8"?> <com.sothree.slidinguppanel.SlidingUpPanelLayout 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:id="@+id/sliding_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom" app:umanoPanelHeight="68dp" app:umanoShadowHeight="4dp" tools:context=".MainActivity"> <FrameLayout android:id="@+id/main_container" android:layout_width="match_parent" android:layout_height="match_parent" /> <FrameLayout android:id="@+id/control_container" android:layout_width="match_parent" android:layout_height="match_parent"/> </com.sothree.slidinguppanel.SlidingUpPanelLayout>