0

My question is quite similar to this one: fragment.getView() return null after backpressed

The problem is next: I have a special Fragment with two states: A and B. If Fragment is in the state B, Backpress should switch the state from B to A. (The difference between two states is in visibility of some elements on a layout) If Fragment is in state A, Backpress should close this Fragment. I overwrote the onBackPressed() method in my activity in next way:

@Override
public void onBackPressed() {

    int count = getSupportFragmentManager().getBackStackEntryCount();
    if (count > 1) {
            if (isStateB) {
                isStateB = false;
                MessagesFragment messFragment = ((MessagesFragment) getSupportFragmentManager().findFragmentByTag("MessagesFragment"));
                if (messFragment != null) {
                    Log.d(TAG, "Message Fragment Refresh");
                    messFragment.refreshFragWithoutMessChecked();
                    return;
                } else {
                    Log.d(TAG, "Fail To Message Fragment Resfresh");
                }
            } 
        }
    }
    super.onBackPressed();
}

This code executes refreshFragWithoutMessChecked() but nothing happens. All elements from the layout which I am trying to close aren't null, but code doesn't affect them. Also I have a button in the MessageFragment which executes the similar method, and in case I press it, the code works well. In additional I found out that if I call getView() inside refreshFragWithoutMessChecked(). In case when it called from onBackPressed(), getView() returns NULL. In case when it called from onClick() it returns something isn't NULL.

So that is why I am asking, why Backpress makes my getView() returns NULL, and how can I solve my problem?

Fragment Code

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    view = inflater.inflate(R.layout.frag_messages, container, false);
    
    /*
    
    Here is a big amount of elements initizalizations and onClick bindings like this:
    check_message = view.findViewById(R.id.check_message);
    check_message.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {MainActivity.isStateB = true;}});
    
    */
    
    return view;
}

public void refreshFragWithoutMessChecked() {

    MainActivity.isStateB = false;
    MainActivity.posMessChecksEnabled.clear();

    refreshMessageFragment();
    Log.d(TAG,"Message Fragment Refreshed");
}

// Refresh Message Fragment
public void refreshMessageFragment() {
    if(getView() != null){
        Log.d(TAG,"A");
    } else {
        Log.d(TAG,"B");
    }
    // Hide Message Check Show
    // THIS CODE DOESN'T WORK ON BACK PRESS BUT IT'S EXECUTED
    if (MainActivity.isStateB == true) {
        ((MainActivity) getActivity()).getSupportActionBar().hide();
        write_message_layout.setVisibility(View.GONE);
        reply_forward_bottom.setVisibility(View.VISIBLE);
        up_message_selected_panel.setVisibility(View.VISIBLE);
        toolbar.setVisibility(View.GONE);
        appbar_layout.setVisibility(View.GONE);
    } else {
        if (fromOpen.equalsIgnoreCase(MainActivity.MESSAGES_FILTER_CONTACTS) == false) {
            write_message_layout.setVisibility(View.VISIBLE);
        }
        reply_forward_bottom.setVisibility(View.GONE);
        up_message_selected_panel.setVisibility(View.GONE);
        toolbar.setVisibility(View.VISIBLE);
        appbar_layout.setVisibility(View.VISIBLE);
    }
}
Jason Aller
  • 3,541
  • 28
  • 38
  • 38

0 Answers0