Я пытался добавить сворачивающуюся панель инструментов к фрагменту, но приложение вылетало, как только я открывал фрагмент: Это ошибка, которую я получаю:
2018-10-19 18:05:38.950 13301-13301/io.github.davidwickerhf.diceroller E/AndroidRuntime: FATAL EXCEPTION: main
Process: io.github.davidwickerhf.diceroller, PID: 13301
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
at androidx.appcompat.app.AppCompatDelegateImpl.<init>(AppCompatDelegateImpl.java:249)
at androidx.appcompat.app.AppCompatDelegate.create(AppCompatDelegate.java:182)
at androidx.appcompat.app.AppCompatActivity.getDelegate(AppCompatActivity.java:520)
at androidx.appcompat.app.AppCompatActivity.findViewById(AppCompatActivity.java:191)
at io.github.davidwickerhf.diceroller.ProfileFragment.onCreateView(ProfileFragment.java:36)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2439)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
at androidx.fragment.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
at android.os.Handler.handleCallback(Handler.java:809)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:7436)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963)
Фрагмент Java:
public class ProfileFragment extends Fragment {
private MainActivity mMainActivity;
private SettingsViewModel settingsViewModel;
private SettingAdapter adapter;
private CoordinatorLayout coordinatorLayout;
private View fragmentView;
private TabLayout mTabLayout;
private ViewPager mViewPager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
fragmentView = inflater.inflate(R.layout.fragment_profile, container, false);
mMainActivity = new MainActivity();
androidx.appcompat.widget.Toolbar mToolbar = fragmentView.findViewById(R.id.profile_toolbar);
mMainActivity.setSupportActionBar(mToolbar);
mViewPager = (ViewPager) fragmentView.findViewById(R.id.viewpager);
ViewPagerAdapter adapter = new ViewPagerAdapter(mMainActivity.getSupportFragmentManager());
adapter.AddFragment(new ProfileInfoFragment(), "Profile");
adapter.AddFragment(new ProfileMessagingFragment(), "Messages");
mViewPager.setAdapter(adapter);
mTabLayout = (TabLayout) fragmentView.findViewById(R.id.tab_layout_profile);
mTabLayout.setupWithViewPager(mViewPager);
return fragmentView;
}
}
Фрагмент XML:
<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:tools = "http://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
xmlns:app = "http://schemas.android.com/apk/res-auto"
tools:context = ".ProfileFragment"
android:orientation = "vertical">
<com.google.android.material.appbar.AppBarLayout
android:id = "@+id/appBar"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:theme = "@style/AppTheme"
app:toolbarId = "@id/profile_toolbar">
<com.google.android.material.appbar.CollapsingToolbarLayout
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:fitsSystemWindows = "true"
app:contentScrim = "?attr/colorPrimary"
app:layout_scrollFlags = "scroll|exitUntilCollapsed"
app:titleEnabled = "false">
<ImageView
android:id = "@+id/background_image_Toolbar"
android:layout_width = "match_parent"
android:layout_height = "256dp"
android:fitsSystemWindows = "true"
android:scaleType = "centerCrop"
app:layout_collapseMode = "parallax" />
<androidx.appcompat.widget.Toolbar
android:layout_marginTop = "24dp"
android:id = "@+id/profile_toolbar"
android:layout_width = "match_parent"
android:layout_height = "?attr/actionBarSize"
app:layout_collapseMode = "pin"
app:popupTheme = "@style/AppTheme" />
</com.google.android.material.appbar.CollapsingToolbarLayout>
<com.google.android.material.tabs.TabLayout
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
app:tabGravity = "fill"
app:tabMode = "fixed"
android:id = "@+id/tab_layout_profile"
app:tabTextColor = "@color/greyText"
app:tabIndicatorColor = "@color/greyText"
android:background = "#fafafa"
android:elevation = "0dp">
</com.google.android.material.tabs.TabLayout>
</com.google.android.material.appbar.AppBarLayout>
<androidx.viewpager.widget.ViewPager
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:id = "@+id/viewpager">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width = "match_parent"
android:layout_height = "match_parent">
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.viewpager.widget.ViewPager>
Пожалуйста помоги?
Спасибо за помощь, я попробовал ваше предложение, но код не компилируется, потому что с помощью функции getActivity () я возвращаю фрагмент
Вы можете сделать это: mMainActivity = (MainActivity) getActivity ();
@ W0rmH0le Большое спасибо! Это сработало!
Отлично. Я отправлю ответ в качестве ответа ... для использования в будущем.




Я предполагаю, что вы получаете эту ошибку, потому что создаете экземпляр нового объекта MainActivity:
mMainActivity = new MainActivity();
В случае Fragments вы можете вызвать в getActivity(), чтобы получить ссылку на деятельность, на которой размещен ваш Fragment. Что-то вроде:
private MainActivity mMainActivity;
....
mMainActivity = (MainActivity) getActivity();
Или вам даже не нужно выполнять приведение к MainActivity, поскольку вы вызываете общий метод (доступен на Activity)
private Activity mMainActivity;
....
mMainActivity = getActivity();
Попробуйте заменить это «mMainActivity = new MainActivity ();» для этого: "mMainActivity = getActivity ()" только для тестов