如何从活动回到片段

时间:2018-02-03 19:55:16

标签: android android-fragments android-intent navigation-drawer

嘿,我是Android开发的新手,我正在尝试使用导航抽屉开发应用程序。所以我用导航抽屉菜单创建了片段,并从其中一个片段中我给出了一个新活动的意图。但是我不知道如何从那个活动回到之前的片段。

MainActivity.java

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

  DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();
    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);

    navigationView.setNavigationItemSelectedListener(this);
 displaySelectedScreen(R.id.nav_bus);
}

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

private void displaySelectedScreen(int itemId) {
Fragment fragment = null;
    switch (itemId) {
        case R.id.nav_bus:
          fragment = new BusFragment();
            break;
        case R.id.nav_hotel:
            fragment = new HotelFragment();
            break;
    }
 if (fragment != null) {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.content_frame, fragment);
        ft.commit();
    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    displaySelectedScreen(item.getItemId());
    return true;
}
}

从这个片段我已经给出了city.java活动的意图

HotelFragment.java

public class HotelFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
   View rootView= inflater.inflate(R.layout.fragment_hotel, container, false);

    Button button = (Button) rootView.findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            updateDetail();
        } });
    return rootView;
}
public void updateDetail() {
    Intent intent = new Intent(getActivity(), City.class);
    startActivity(intent);
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    getActivity().setTitle("Hotel");
}
}

City.java

public class City extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_city_list);      
}    }

在清单文件中,我添加了此

   <activity android:name=".City_List"
        android:parentActivityName = "MainActivity"
       >
        <meta-data
            android:name = "android.support.PARENT_ACTIVITY"
            android:value = "MainActivity" />
    </activity>
   </application>

2 个答案:

答案 0 :(得分:1)

能够返回上一个片段应该包含.addToBackStack()

if (fragment != null) {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.content_frame, fragment);
        ft.addToBackstack(null)
        ft.commit();
    }

当您以编程方式单击工具栏中的后退按钮时,请使用以下代码返回上一个片段。

if ( getFragmentManager().getBackStackEntryCount() > 0) 
{
          getFragmentManager().popBackStack();
          return;
}
super.onBackPressed();

答案 1 :(得分:0)

将此行添加到后按方法中

 if(getFragmentManager().getBackStackEntryCount() > 0) {
            getFragmentManager().popBackStack();
        }
        else {
            super.onBackPressed();
        }