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」',並確保它有一個背景,以便我看不到底下。 –