1

2つのフラグメントを使用するアクティビティが1つあります(MainFragmentおよびDetailFragment)。 MainFragmentには、グループとしての会社名と子としてのロケーション名を持つ展開可能なリストビューがあります。ユーザーがナビゲーションドロワからカテゴリを選択すると、アダプタ内のデータが更新され、展開可能なリストが更新され、正しい会社が表示されます。PopBackStackのデータを保持

ユーザーが場所を選択すると、その場所と従業員に関する情報を含むDetailFragmentが開きます。私が持っている問題は、私が後退したときです。戻るボタンを押すとデフォルトのカテゴリにリセットされ、onViewCreated()メソッドを再度呼び出すため、ビューとアダプタを設定していることがわかりました。奇妙なことは、リスト項目が展開されたものをインデックスで覚えていることです。したがって、3番目のアイテムを別のカテゴリに展開した場合、デフォルトカテゴリの3番目のアイテムはまだ展開されています。

私が知りたいことは、私が押したときの設定をどうやって維持できるのでしょうか?あなたのトランザクションでadd代わりのreplaceを使用する必要があります

マイ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

+0

メインフラグメントの上にDetail Fragmentを配置し、Main Fragmentにあるアイテムをクリックできるという点を除いて、それは機能します。 –

+1

これを修正するには、レイアウトに 'android:clickable =" true "'を追加して、背景があることを確認して下には見えませんでした。 –

関連する問題