【问题标题】:How to go back from an activity to fragment如何从活动返回到片段
【发布时间】:2018-02-03 19:55:16
【问题描述】:

嘿,我是 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>

【问题讨论】:

  • 究竟是什么问题,当您说我无法返回片段时,您的意思是您不知道如何关闭活动,或者当您按下返回按钮时片段会消失?
  • 我想在工具栏中添加一个后退按钮,以返回上一个片段屏幕。

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


【解决方案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();

【讨论】:

    【解决方案2】:

    在后按方法中添加这一行

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

    【讨论】:

      猜你喜欢
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多