Доброе утро. Я уже начал много поисков. Представления, объявленные как фрагменты, иногда приводят к нулю. Проблема на самом деле случается иногда. Не выходит при тестировании. Тем не менее, nullPointexception произошло в отчете об ошибке. Я выложу полный код. Я не знаю что делать help.
MainActivty. java
publi c Класс MainActivity расширяет класс ToNightActivity, реализует BottomBar.OnBottomBarClickListener, AdvanceRecyclerView.OnItemClickListener {
private ViewMapper viewMapper;
private ViewPagerAdapter< ToNightFragment > adapter;
private ArrayList< ToNightFragment > fragments;
private ParentFragment parentFragment;
private ChatListFragment chatListFragment;
private SettingFragment settingFragment;
private boolean appLoading = false;
private long backPressedTime = 0;
private ArrayList< ToNightFragment > childFragments = new ArrayList<>( );
@Override
protected void onCreate( @Nullable Bundle savedInstanceState ) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
viewMapper = new ViewMapper( );
viewInit( );
setData( );
}
@Override
protected void viewInit( ) {
super.viewInit( );
viewMapper.bottomBar.setLeftButton( new BottomBar.ButtonItem( ).setTag( C.tag.BOTTOM_BAR_HOME ) );
viewMapper.bottomBar.setMiddleButton( new BottomBar.ButtonItem( ).setTag( C.tag.BOTTOM_BAR_CHAT ) );
viewMapper.bottomBar.setRightButton( new BottomBar.ButtonItem( ).setTag( C.tag.BOTTOM_BAR_MORE ) );
}
@Override
protected void setData( ) {
super.setData( );
fragments = new ArrayList<>( );
fragments.add( parentFragment = ParentFragment.newInstance( ) );
fragments.add( chatListFragment = ChatListFragment.newInstance( ) );
fragments.add( settingFragment = SettingFragment.newInstance( ) );
adapter = new ViewPagerAdapter<>( getSupportFragmentManager( ), fragments );
viewMapper.viewPager.setAdapter( adapter );
viewMapper.viewPager.setLockPager( true );
viewMapper.viewPager.setOffscreenPageLimit( 3 );
viewMapper.bottomBar.setOnBottomBarClickListener( this );
if ( getSerialize( C.bundleKey.CHAT_INFO ) != null ) {
new Handler( ).postDelayed( ( ) -> sendAction( ChatRoomActivity.class, Utils.createSerializableBundle( C.bundleKey.CHAT_INFO, getSerialize( C.bundleKey.CHAT_INFO ) ) ), 500 );
} else {
setUpViews( );
}
}
@Override
protected void onNewIntent( Intent intent ) {
super.onNewIntent( intent );
if ( intent.getSerializableExtra( C.bundleKey.CHAT_INFO ) == null ) {
finish( );
} else {
new Handler( ).postDelayed( ( ) -> sendAction( ChatRoomActivity.class, Utils.createSerializableBundle( C.bundleKey.CHAT_INFO, intent.getSerializableExtra( C.bundleKey.CHAT_INFO ) ) ), 500 );
}
}
@Override
public void onBottomBarClick( Object tag, View view ) {
if ( Utils.equals( tag, C.tag.BOTTOM_BAR_HOME ) ) {
Utils.setPreferenceData( this, C.pref.MAIN_PAGER_POSITION, 0 );
//parentFragment.getParentPager NullPointExecption Error
parentFragment.setBottomClickDataSet( parentFragment.getParentPager( ).getCurrentItem( ) );
.......
.......
} else if ( Utils.equals( tag, C.tag.BOTTOM_BAR_CHAT ) ) {
FirebaseCrashlytics.getInstance( ).log( "Main onBottomBarClick BOTTOM_BAR_CHAT" );
Utils.setPreferenceData( this, C.pref.MAIN_PAGER_POSITION, 1 );
chatListFragment.setData( );
} else if ( Utils.equals( tag, C.tag.BOTTOM_BAR_MORE ) ) {
Utils.setPreferenceData( this, C.pref.MAIN_PAGER_POSITION, 2 );
settingFragment.setData( );
}
setUpViews( );
}
@Override
public void onItemClick( AdvanceRecyclerView recyclerView, View view, int position ) {
}
public void setUpViews( ) {
viewMapper.bottomBar.getBadgeView( ).setVisibility( ( int ) Utils.getPreferenceData( this, C.pref.BADGE_COUNT, 0 ) > 0 ? View.VISIBLE : View.INVISIBLE );
switch ( ( int ) Utils.getPreferenceData( this, C.pref.MAIN_PAGER_POSITION, 0 ) ) {
case 0:
viewMapper.bottomBar.setOn( BottomBar.ON.HOME );
viewMapper.viewPager.setCurrentItem( 0 );
break;
case 1:
viewMapper.bottomBar.setOn( BottomBar.ON.CHAT );
viewMapper.viewPager.setCurrentItem( 1 );
break;
case 2:
viewMapper.bottomBar.setOn( BottomBar.ON.MORE );
viewMapper.viewPager.setCurrentItem( 2 );
break;
}
}
@Override
public void onBackPressed( ) {
if ( getPopupViewStack( ) != null && !getPopupViewStack( ).isEmpty( ) ) {
onRemovePopup( getPopupViewStack( ).peek( ) );
getPopupViewStack( ).pop( ).onBackPressed( );
} else {
//parentFragment.getParentPager NullPointExecption
if ( parentFragment.getParentPager( ).getCurrentItem( ) == 2 ) {
.....
.....
}
Utils.hideKeyboard( this, getCurrentFocus( ) );
}
@Override
protected void onResume( ) {
super.onResume( );
setUpViews( );
if ( appLoading && viewMapper.viewPager.getCurrentItem( ) == 1 ) {
chatListFragment.setData( );
} else if ( appLoading && viewMapper.viewPager.getCurrentItem( ) == 2 ) {
settingFragment.setData( );
}
appLoading = true;
}
private class ViewMapper {
private LockableViewPager viewPager;
private BottomBar bottomBar;
public ViewMapper( ) {
viewPager = findViewById( R.id.viewPager_main );
bottomBar = findViewById( R.id.bottomBar );
}
}
10F.
publi c класс ParentFragment расширяет ToNightFragment, реализует ViewPager.OnPageChangeListener, ToolBar.OnToolBarClickListener {
private ViewMapper viewMapper;
private ArrayList< ToNightFragment > fragments;
private ChoiceMainPlaceFragment choiceMainPlaceFragment;
private ChoiceSubPlaceFragment choiceSubPlaceFragment;
private PlaceBoardFragment placeBoardFragment;
private ViewPagerAdapter< ToNightFragment > adapter;
private String toolbarCityTitle;
private String toolbarLocationTitle;
private String cityCode;
private String locationCode;
private Context context;
@Override
public void onAttach( Context context ) {
super.onAttach( context );
this.context = context;
}
public ParentFragment( ) {
}
public void setFragments( ArrayList< ToNightFragment > fragments ) {
this.fragments = fragments;
}
public static ParentFragment newInstance( ) {
return new ParentFragment( );
}
public static ParentFragment newInstance( ArrayList< ToNightFragment > fragments ) {
ParentFragment fragment = new ParentFragment( );
fragment.setFragments( fragments );
return fragment;
}
@Override
public void onCreate( @Nullable Bundle savedInstanceState ) {
super.onCreate( savedInstanceState );
setContentView( R.layout.fragment_parent );
}
@Override
public View onCreateView( @NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState ) {
viewMapper = new ViewMapper( );
viewInit( );
setData( );
return super.onCreateView( inflater, container, savedInstanceState );
}
@Override
protected void viewInit( ) {
super.viewInit( );
viewMapper.toolbar.setOnToolBarClickListener( this );
//default toolbar title
viewMapper.toolbar.setTitle( "1차 지역 선택" );
}
@Override
public void setData( ) {
super.setData( );
fragments = new ArrayList<>( );
fragments.add( choiceMainPlaceFragment = ChoiceMainPlaceFragment.newInstance( ) );
fragments.add( choiceSubPlaceFragment = ChoiceSubPlaceFragment.newInstance( ) );
fragments.add( placeBoardFragment = PlaceBoardFragment.newInstance( ) );
adapter = new ViewPagerAdapter<>( getChildFragmentManager( ), fragments );
viewMapper.viewPager.setAdapter( adapter );
viewMapper.viewPager.setLockPager( true );
viewMapper.viewPager.setCurrentItem( 0 );
viewMapper.viewPager.setOffscreenPageLimit( 3 );
viewMapper.viewPager.addOnPageChangeListener( this );
FirebaseCrashlytics.getInstance( ).log( "ParentFragment setData 완료" );
}
public void setBottomClickDataSet( int position ) {
if ( position == 0 ) {
choiceMainPlaceFragment.setBoardAPICall( );
} else if ( position == 1 ) {
choiceSubPlaceFragment.setBoardAPICall( cityCode );
} else if ( position == 2 ) {
placeBoardFragment.getListView( ).resetState( );
placeBoardFragment.setBoardAPICall( locationCode );
}
}
@Override
public void onPageScrolled( int position, float positionOffset, int positionOffsetPixels ) {
}
@Override
public void onPageSelected( int position ) {
viewMapper.toolbar.getButtonItems( ).clear( );
viewMapper.toolbar.removeLeftButton( );
viewMapper.toolbar.removeRightButton( );
if ( position == 0 ) {
viewMapper.toolbar.setTitle( "1차지역선택" );
choiceMainPlaceFragment.setBoardAPICall( );
} else if ( position == 1 ) {
viewMapper.toolbar.addLeftButton( new ToolBar.ButtonItem( R.drawable.image_toolbar_back ).setTag( C.tag.TOOLBAR_BACK ) );
viewMapper.toolbar.setTitle( String.format( "%s ", "2차 지역 선택 (" + toolbarCityTitle + ")" ) );
choiceSubPlaceFragment.setBoardAPICall( cityCode );
} else if ( position == 2 ) {
viewMapper.toolbar.setTitle( toolbarLocationTitle );
viewMapper.toolbar.addLeftButton( new ToolBar.ButtonItem( R.drawable.image_toolbar_back ).setTag( C.tag.TOOLBAR_BACK ) );
viewMapper.toolbar.addRightButton( new ToolBar.ButtonItem( "신고" ).setTag( C.tag.TOOLBAR_REPORT ) );
try {
// placeBoardFragment.getListView( ) NullPointException Error
placeBoardFragment.getListView( ).resetState( );
placeBoardFragment.setBoardAPICall( locationCode );
} catch ( Exception e ) {
e.printStackTrace( );
FirebaseCrashlytics.getInstance( ).recordException( e );
}
}
}
@Override
public void onPageScrollStateChanged( int state ) {
}
@Override
public void onToolBarClick( Object tag, View view ) {
if ( Utils.equals( tag, C.tag.TOOLBAR_BACK ) ) {
Objects.requireNonNull( getActivity( ) ).onBackPressed( );
} else if ( Utils.equals( tag, C.tag.TOOLBAR_REPORT ) ) {
if ( Utils.equals( viewMapper.toolbar.getRightTitle( ), "신고" ) ) {
viewMapper.toolbar.setRightTitle( "완료" );
viewMapper.toolbar.setRightTitleColor( Color.parseColor( "#4B46BE" ) );
placeBoardFragment.getAdapter( ).setReportActive( true );
placeBoardFragment.getAdapter( ).notifyDataSetChanged( );
} else {
if ( placeBoardFragment.getReportUUIDTargets( ).size( ) == 0 && placeBoardFragment.getReportBoardIdTargets( ).size( ) == 0 ) {
viewMapper.toolbar.setRightTitle( "신고" );
viewMapper.toolbar.setRightTitleColor( Color.parseColor( "#FFFFFF" ) );
placeBoardFragment.getAdapter( ).setReportActive( false );
placeBoardFragment.getAdapter( ).notifyDataSetChanged( );
} else {
placeBoardFragment.PlaceBoardReportPopupOn( );
}
}
}
}
public LockableViewPager getParentPager( ) {
//NullPointException Error
return viewMapper.viewPager;
}
public AdvanceRecyclerView getPlaceBoardListView( ) {
//NullPointException Error
return placeBoardFragment.getListView( );
}
private class ViewMapper {
LockableViewPager viewPager;
ToolBar toolbar;
public ViewMapper( ) {
viewPager = findViewById( R.id.viewPager_parent );
toolbar = findViewById( R.id.toolBar );
}
}
ChatListFragment. java
exteFListist c публицистик ToNightFragment реализует AdvanceRecyclerView.OnItemClickListener, ToolBar.OnToolBarClickListener, PopupMenu.OnMenuItemClickListener, NetworkInterface, SwipeRefreshLayout.OnRefreshListener, фрагмент View.OnClickListener *1010* 1015 * * * *, который является * уникальным классом * 1015. ToNightFragment. java
publi c абстрактный класс ToNightFragment расширяет Fragment реализует NetworkInterface {
private View contentView;
protected boolean transition = true;
@Override
public void onAttach( Context context ) {
super.onAttach( context );
}
@Override
public View onCreateView( @NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState ) {
if ( this.contentView != null ) return this.contentView;
else return super.onCreateView( inflater, container, savedInstanceState );
}
@Override
public void onResume( ) {
super.onResume( );
}
@Override
public void onReceive( boolean error, int requestCode, int resultCode, int statusCode, String result ) {
}
protected ToNightActivity getToNightActivity( ) {
return ( ToNightActivity ) getActivity( );
}
protected void viewInit( ) {
}
public void setData( ) {
}
public void setContentView( int resId ) {
this.contentView = View.inflate( getToNightActivity( ), resId, null );
overrideFonts( this.contentView );
}
public < T extends View > T findViewById( int resId ) {
if ( this.contentView != null ) return this.contentView.findViewById( resId );
else return null;
...
}
ViewPagerAdapter. java
publi c класс ViewPagerAdapter < T extends Fragment> extends FragmentStatePagerAdapter {ArrayList фрагментов;
public ViewPagerAdapter( FragmentManager fm, ArrayList< T > fragments ) {
super( fm );
this.fragments = fragments;
}
@Override
public int getItemPosition( Object object ) {
return this.fragments.indexOf( object );
}
@Override
public int getCount( ) {
return this.fragments.size( );
}
@Override
public Fragment getItem( int position ) {
return this.fragments.get( position );
}
}