1

두 조각 인 MainFragmentDetailFragment을 사용하는 활동이 하나 있습니다. MainFragment에는 회사 이름이 그룹 및 위치 이름을 자식으로 갖는 확장 가능한 목록보기가 있습니다. 사용자가 탐색 창에서 카테고리를 선택하면 어댑터의 데이터를 업데이트하고 확장 가능한 목록을 업데이트하여 올바른 회사를 표시합니다.PopBackStack에서 데이터 보존

사용자가 위치를 선택하면 해당 위치 및 직원에 대한 정보가있는 DetailFragment가 열립니다. 내가 가지고있는 문제는 내가 뒤로 물러 설 때이다. 뒤로 버튼을 눌렀을 때 기본 카테고리로 다시 설정되고, onViewCreated() 메서드를 다시 호출하기 때문에 그것이 내 뷰와 어댑터를 설정하기 때문에 알아 냈습니다. 이상한 점은 목록 항목이 확장 된 것을 색인별로 기억합니다. 따라서 세 번째 항목을 다른 범주로 확장 한 경우 기본 범주의 세 번째 항목은 계속 확장됩니다.

내가 알고 싶은 것은 어떻게 내가 뒤로 물러 설 때 설정을 유지할 수 있습니까?

내 MainFragment

public class MainFragment extends Fragment implements ExpandableListView.OnChildClickListener, NavigationSelectedListener { 

    private CompaniesExpandableListAdapter adapter; 

    public MainFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.fragment_main, container, false); 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

     connectViews(view); 
    } 

    private void connectViews(View view) { 
     final ExpandableListView companyListView = (ExpandableListView) view.findViewById(R.id.companyListView); 

     final Navigation navigationItem = ((MainActivity) getActivity()).getNavigationItems().first(); 
     getActivity().setTitle(navigationItem.getTitle()); 

     adapter = new CompaniesExpandableListAdapter(navigationItem.getCompanies()); 
     companyListView.setAdapter(adapter); 
     companyListView.setOnChildClickListener(this); 
    } 

    // ExpandableListView.OnChildClickListener 
    @Override 
    public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { 
     final DetailFragment detailFragment = new DetailFragment(); 

     final Bundle args = new Bundle(); 
     args.putInt(getString(R.string.extra_location_key), ((Locations) adapter.getChild(groupPosition, childPosition)).getPrimaryKey()); 

     detailFragment.setArguments(args); 

     getFragmentManager() 
       .beginTransaction() 
       .replace(R.id.contentFrame, detailFragment, getString(R.string.tag_fragment_detail)) 
       .addToBackStack(null) 
       .commit(); 

     return false; 
    } 

    // NavigationSelectedListener 
    @Override 
    public void onNavigationItemSelected(Navigation navigationItem) { 
     // Go back to the main fragment. 
     getFragmentManager().popBackStack(getString(R.string.tag_fragment_main), FragmentManager.POP_BACK_STACK_INCLUSIVE); 

     // Send the selected item to the adapter. 
     adapter.updateData(navigationItem.getCompanies()); 
     getActivity().setTitle(navigationItem.getTitle()); 
    } 
} 

그리고 당신은 당신의 거래에 add 대신 replace를 사용해야합니다

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { 

    private NavigationSelectedListener navigationCallback; 

    private DrawerLayout drawerLayout; 

    private RealmResults<Navigation> navigationItems; 

    private MainFragment mainFragment = new MainFragment(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     buildNavigationDrawer(); 
     connectViews(); 
    } 

    @Override 
    public void onBackPressed() { 
     if (drawerLayout.isDrawerOpen(GravityCompat.START)) drawerLayout.closeDrawer(GravityCompat.START); 
     else super.onBackPressed(); 
    } 

    @Override 
    public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
     navigationCallback.onNavigationItemSelected(navigationItems.get(item.getItemId())); 

     drawerLayout.closeDrawer(GravityCompat.START); 

     return true; 
    } 

    private void connectViews() { 
     navigationCallback = mainFragment; 

     getFragmentManager() 
       .beginTransaction() 
       .replace(R.id.contentFrame, mainFragment, getString(R.string.tag_fragment_main)) 
       .commit(); 
    } 

    private void buildNavigationDrawer() { 
     final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 

     final ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) { 

      @Override 
      public void onDrawerStateChanged(int newState) { 
       super.onDrawerStateChanged(newState); 

       // Hides the device keyboard when the navigation drawer is opened. 
       if (getCurrentFocus() != null) ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); 
      } 
     }; 

     drawerLayout.addDrawerListener(toggle); 
     toggle.syncState(); 

     fillNavigationDrawer(); 
    } 

    public RealmResults<Navigation> getNavigationItems() { 
     return navigationItems; 
    } 
} 

답변

2

내 MainActivity.

+0

기본 조각 상단에 Detail Fragment를 배치하고 Main Fragment에있는 항목을 계속 클릭 할 수 있다는 점을 제외하면 작동합니다. –

+1

이 문제를 해결하기 위해 레이아웃에'android : clickable = "true"'를 추가하고 밑에 보이지 않도록 배경이 있는지 확인해야했습니다. –