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()); 
    } 
} 

我的MainActivity

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

你应该在你的交易使用add代替replace

+0

这是有效的,除了它在主片段顶部放置细节片段,并且我仍然可以点击主片段中的项目。 –

+1

要解决这个问题,我必须在布局中添加'android:clickable =“true”',并确保它有一个背景,以便我看不到底下。 –