Иногда представление, объявленное во фрагменте android, является нулевым - PullRequest
0 голосов
/ 03 мая 2020

Доброе утро. Я уже начал много поисков. Представления, объявленные как фрагменты, иногда приводят к нулю. Проблема на самом деле случается иногда. Не выходит при тестировании. Тем не менее, 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 );
}

}

...