こんにちは、メイン アクティビティに Menu Drawer があり、2 つの Fragment があります。最初の Fragment にはタブ バーが含まれており、2 番目の Fragment はシンプルです。2 番目のフラグメント 単純なフラグメント。
私が2番目のフラグメントにいて、バックスタックのバックプレスボタンにいるとき、その時点で最後のフラグメントをポップすると、不正な引数の例外というエラーが発生します。
ここにメインクラス(メニュードロワー)があります:
public class HomeActivity extends Activity {
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
private SessionCreator m_session;
private CharSequence mDrawerTitle;
private CharSequence mTitle;
private static String[] mPlanetTitles = {"NewsFeed","Profile", "Worlds", "Leaderboard",
"Map", "Feedback", "Settings"};
boolean btn_back = true;
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.drawer_main);
mTitle = mDrawerTitle = getTitle();
//mPlanetTitles = getResources().getStringArray(R.array.planets_array);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.left_drawer);
// set a custom shadow that overlays the main content when the drawer opens
//mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
// set up the drawer's list view with items and click listener
mDrawerList.setAdapter(new ArrayAdapter<String>(this,
R.layout.drawer_list_item, mPlanetTitles));
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
// enable ActionBar app icon to behave as action to toggle nav drawer
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
// ActionBarDrawerToggle ties together the the proper interactions
// between the sliding drawer and the action bar app icon
mDrawerToggle = new ActionBarDrawerToggle(
this, /* host Activity */
mDrawerLayout, /* DrawerLayout object */
R.drawable.drawer_menu, /* nav drawer image to replace 'Up' caret */
R.string.drawer_open, /* "open drawer" description for accessibility */
R.string.drawer_close /* "close drawer" description for accessibility */
) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(mTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(mDrawerTitle);
// getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
if (savedInstanceState == null) {
selectItem(2);
}
Common.setObject(mDrawerLayout, mDrawerList);
getFragmentManager().addOnBackStackChangedListener(new OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
// TODO Auto-generated method stub
Fragment f = getFragmentManager().findFragmentById(R.id.content_frame);
if(f!=null){
updateTitelandDrawer(f);
}
}
private void updateTitelandDrawer(Fragment f) {
// TODO Auto-generated method stub
String fragclassName = f.getClass().getName();
Log.d("CheckFragmentStatus", ""+f.toString());
}
});
}
/* Called whenever we call invalidateOptionsMenu() */
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// If the nav drawer is open, hide action items related to the content view
//boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
//menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);
return super.onPrepareOptionsMenu(menu);
}
/* The click listner for ListView in the navigation drawer */
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectItem(position);
}
}
private void selectItem(int position) {
Fragment fragment = null;
Bundle args;
AppData mApp = (AppData) getApplicationContext();
String szUserId = mApp.getUserId();
switch (position) {
case 0:// news feed
// update the main content by replacing fragments
// requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
fragment = new NewsfeedActivity();
args = new Bundle();
args.putString("userId", szUserId);
fragment.setArguments(args);
break;
case 1:// profile
fragment = new ProfileDetailsActivity();
args = new Bundle();
args.putString("userId", szUserId);
args.putString("profileId", szUserId);
fragment.setArguments(args);
break;
case 2:// world
// update the main content by replacing fragments
fragment = new WorldsMainActivity();
args = new Bundle();
args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position);
fragment.setArguments(args);
break;
default:
getActionBar()
.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
fragment = new PlanetFragment();
args = new Bundle();
args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position);
fragment.setArguments(args);
}
// call fragment class
replaceFragment(fragment);
// update selected item and title, then close the drawer
mDrawerList.setItemChecked(position, true);
setTitle(mPlanetTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
}
@Override
public void setTitle(CharSequence title) {
mTitle = title;
getActionBar().setTitle(mTitle);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggls
mDrawerToggle.onConfigurationChanged(newConfig);
}
/**
* Fragment that appears in the "content_frame", shows a planet
*/
public static class PlanetFragment extends Fragment {
public static final String ARG_PLANET_NUMBER = "planet_number";
public PlanetFragment() {
// Empty constructor required for fragment subclasses
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.coming_soon, container, false);
int i = getArguments().getInt(ARG_PLANET_NUMBER);
String planet = mPlanetTitles[i];
getActivity().setTitle(planet);
return rootView;
}
}
private void replaceFragment (Fragment fragment){
String backStateName = fragment.getClass().getName();
String fragmentTag = backStateName;
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
boolean fragmentPopped = manager.popBackStackImmediate (backStateName, 0);
if (!fragmentPopped) {
transaction.replace(R.id.content_frame, fragment);
}
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
transaction.addToBackStack(null);
transaction.commit();
}
// handle fragment navigation backstack push/pop operation
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
if (getFragmentManager().getBackStackEntryCount() == 1) {
Log.d("MyHomeBackStack", ""
+ getFragmentManager().getBackStackEntryCount());
if (btn_back) {
Toast.makeText(getApplicationContext(), "Press Again",
Toast.LENGTH_LONG).show();
btn_back = false;
} else {
Exitdialog_message("Do you want to exit?");
}
} else {
super.onBackPressed();
}
}
//application exit dialog box
@SuppressWarnings("deprecation")
public void Exitdialog_message(String string) {
final AlertDialog alertDialog = new AlertDialog.Builder(
HomeActivity.this).create();
alertDialog.setTitle(getResources().getString(R.string.app_name));
alertDialog.setMessage(string);
alertDialog.setButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
finish();
System.exit(0);
}
});
alertDialog.setButton2("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
alertDialog.dismiss();
}
});
alertDialog.show();
}
}
これが私のフラグメントクラス1です。
public class NewsfeedActivity extends Fragment {
// Declaring our tabs and the corresponding fragments.
ActionBar.Tab ownNF, groupNF, publicNF;
Fragment ownFragment = new NewsFeedOwn();
Fragment groupFragment = new NewsFeedGroups();
Fragment publicFragment = new NewsFeedPublic();
ActionBar actionBar;
SessionCreator session;
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,Bundle savedInstanceState) {
View myInflatedView = inflater.inflate(R.layout.newsfeed_main, container,false);
return myInflatedView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
// Asking for the default ActionBar element that our platform supports.
actionBar = getActivity().getActionBar();
// Screen handling while hiding ActionBar icon.
actionBar.setDisplayShowHomeEnabled(true);
// Screen handling while hiding Actionbar title.
actionBar.setDisplayShowTitleEnabled(true);
actionBar.removeAllTabs();
// Creating ActionBar tabs.
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// Setting custom tab icons.
ownNF = actionBar.newTab().setIcon(R.drawable.nf_own_blue);
groupNF = actionBar.newTab().setIcon(R.drawable.nf_group_blue);
publicNF = actionBar.newTab().setIcon(R.drawable.nf_public_blue);
((NewsFeedOwn)ownFragment).setParentFrag(getActivity());
((NewsFeedOwn)ownFragment).setFrag(this);
((NewsFeedGroups)groupFragment).setParentFrag(getActivity());
((NewsFeedGroups)groupFragment).setFrag(this);
((NewsFeedPublic)publicFragment).setParentFrag(getActivity());
((NewsFeedPublic)publicFragment).setFrag(this);
// Setting tab listeners.
ownNF.setTabListener(new NewsfeedTabListener(ownFragment));
groupNF.setTabListener(new NewsfeedTabListener(groupFragment));
publicNF.setTabListener(new NewsfeedTabListener(publicFragment));
// Adding tabs to the ActionBar.
actionBar.addTab(ownNF);
actionBar.addTab(groupNF);
actionBar.addTab(publicNF);
}
public String getUserId()
{
// get user id and profile id
Bundle data = getArguments();
String szUserId = data.getString("userId");
return szUserId;
}
public void executeGetNewsFeedTask(int nsType, NewsFeedFragment frag)
{
GetNewsFeedTask trickCmd = new GetNewsFeedTask(nsType, frag);
trickCmd.execute();
}
@Override
public void onDestroyView() {
// TODO Auto-generated method stub
//getActivity().getActionBar().removeAllTabs();
// getActivity().getActionBar().removeAllTabs();
// getActivity().getActionBar().hide();
// Fragment mFrag = new NewsfeedActivity();
// getFragmentManager().beginTransaction().remove(mFrag).commit();
super.onDestroyView();
}
}
ここに2番目のフラグメントクラスがあります:
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,Bundle savedInstanceState) {
Log.d("ProfileBackStackAction", ""+getFragmentManager().getBackStackEntryCount());
if(getFragmentManager().getBackStackEntryCount()>1){
Toast.makeText(getActivity(), "Called", Toast.LENGTH_LONG).show();
getActivity().getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
// getActivity().getActionBar().setHomeButtonEnabled(true);
// getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
// getActivity().getActionBar().setDisplayUseLogoEnabled(false);
}else{
getActivity().getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
}
View myInflatedView = inflater.inflate(R.layout.profile_details_main, container,false);
init(myInflatedView);
m_bAllTricksView = false;
// get user id and profile id
Bundle data = getArguments();
szUserId = data.getString("userId");
szProfileId = data.getString("profileId");
m_lvTricks = (ListView) myInflatedView.findViewById(R.id.lvLatestTricks);
adapter = new FollowerListAdapter(getActivity(), trickList);
m_lvTricks.setAdapter(adapter);
m_lvTricks.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
FollowerOrTrickItem trickItem = (FollowerOrTrickItem) parent.getItemAtPosition(position);
Intent intent = new Intent(getActivity(), TrickDetailsActivity.class);
//TODO:: pass trick id, profile id, user id
intent.putExtra("userId", szUserId);
intent.putExtra("profileId", szProfileId);
intent.putExtra("trickId", trickItem.szProfileId);
startActivity(intent);
}
});
m_civProfPic.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Bundle bundle = new Bundle();
bundle.putString("userId", szUserId);
bundle.putString("profileId", szProfileId);
bundle.putString("ImagePath", ImageUrl);
UpdatePicture updatePicture = new UpdatePicture();
updatePicture.setArguments(bundle);
FragmentManager manager = getFragmentManager();
android.app.FragmentTransaction transection = manager.beginTransaction();
transection.replace(R.id.content_frame, updatePicture);
transection.addToBackStack("updatePicture");
transection.commit();
}
});
m_ivCover.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Bundle bundle = new Bundle();
bundle.putString("userId", szUserId);
bundle.putString("profileId", szProfileId);
bundle.putString("ImagePath", CoverImageUrl);
UpdatePicture updateCover = new UpdatePicture();
updateCover.setArguments(bundle);
FragmentManager manager = getFragmentManager();
android.app.FragmentTransaction transection = manager.beginTransaction();
transection.replace(R.id.content_frame, updateCover);
transection.addToBackStack("updateCover");
transection.commit();
}
});
// send request to fetch worlds and fetch status of each three levels from response
String strURL = GlobalMethod.TokenGenerator() + "&action=getProfileData";
ProfileCmdTask taskCmd = new ProfileCmdTask();
taskCmd.execute(szUserId, szProfileId, strURL);
return myInflatedView;
}
タブバーが空白のページまたはリストビューを表示して2番目のフラグメントから最初のフラグメントに戻るときのログ猫は次のとおりです。2番目のタブを移動しようとすると、不正な引数例外の問題が発生します
ここに私のログがあります:
06-18 02:19:03.004: E/AndroidRuntime(4020): FATAL EXCEPTION: main
06-18 02:19:03.004: E/AndroidRuntime(4020): Process: com.prostart.zoneln, PID: 4020
06-18 02:19:03.004: E/AndroidRuntime(4020): java.lang.IllegalArgumentException: No view found for id 0x7f0b0072 (com.prostart.zoneln:id/newsfeed_root) for fragment NewsFeedGroups{530daf0c #2 id=0x7f0b0072}
06-18 02:19:03.004: E/AndroidRuntime(4020): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:882)
06-18 02:19:03.004: E/AndroidRuntime(4020): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
06-18 02:19:03.004: E/AndroidRuntime(4020): at android.app.BackStackRecord.run(BackStackRecord.java:684)
06-18 02:19:03.004: E/AndroidRuntime(4020): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
06-18 02:19:03.004: E/AndroidRuntime(4020): at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
06-18 02:19:03.004: E/AndroidRuntime(4020): at android.os.Handler.handleCallback(Handler.java:733)
06-18 02:19:03.004: E/AndroidRuntime(4020): at android.os.Handler.dispatchMessage(Handler.java:95)
06-18 02:19:03.004: E/AndroidRuntime(4020): at android.os.Looper.loop(Looper.java:136)
06-18 02:19:03.004: E/AndroidRuntime(4020): at android.app.ActivityThread.main(ActivityThread.java:5001)
06-18 02:19:03.004: E/AndroidRuntime(4020): at java.lang.reflect.Method.invokeNative(Native Method)
06-18 02:19:03.004: E/AndroidRuntime(4020): at java.lang.reflect.Method.invoke(Method.java:515)
06-18 02:19:03.004: E/AndroidRuntime(4020): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
06-18 02:19:03.004: E/AndroidRuntime(4020): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
06-18 02:19:03.004: E/AndroidRuntime(4020): at dalvik.system.NativeStart.main(Native Method)
このリンクは、バックスタックがどのように機能するかを示しています