【问题标题】:Android Return back to same fragment after click on goto first fragment in view pagerAndroid单击转到viewpager中的第一个片段后返回相同的片段
【发布时间】:2014-04-23 06:20:33
【问题描述】:

我开发了一个应用程序,其中一个我使用片段查看寻呼机。我使用片段类移动到另一个页面。在第二个片段类中,我有一个按钮,我编写代码直接移动到第一个片段通过fragment.replace,但是在替换第一个片段后,我不会将寻呼机页面滚动到另一个,这意味着当我单击后退按钮时,我会移动到第一个片段,但我无法再次返回该类。所以我不知道再次将移动/滚动页面移动到第二个片段。请尽快帮助我,在此先感谢。

我的第一堂课:

enter code here
         public class ViewPagerMainActivity extends FragmentActivity implements
    OnClickListener, OnPageChangeListener {

   // all variable declare here
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);



    getWindow().setFlags(
            WindowManager.LayoutParams.FLAG_FULLSCREEN
                    | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD,
            WindowManager.LayoutParams.FLAG_FULLSCREEN
                    | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                    );

    setTheme(android.R.style.Theme_Light_NoTitleBar);


    setContentView(R.layout.view_pager_main);
    // other code here

}

private class MyPagerAdapter extends FragmentPagerAdapter {

    public MyPagerAdapter(
            android.support.v4.app.FragmentManager fragmentManager) {
        super(fragmentManager);
    }

    @Override
    public Fragment getItem(int pos) {
        switch (pos) {

        case 0:
            return FirstFragment.newInstance("");

        case 1:
            return SecondFragment.newInstance("");

        default:
            return SecondFragment.newInstance("Default");
        }
    }

    @Override
    public int getCount() {
        return 2; // return no of fragment created by us
    }
}

@Override
public void onClick(View v) {

}

@Override
public void onPageScrollStateChanged(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
    // TODO Auto-generated method stub

}

@Override
public void onPageSelected(int arg0) {
    // TODO Auto-generated method stub

}
@Override
public void onBackPressed() {
    // TODO Auto-generated method stub
}

}

enter code here  SECOND FILE
           public class FirstFragment extends Fragment implements OnTouchListener {

      // all variable decalre here
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    getActivity().setTheme(android.R.style.Theme_Light_NoTitleBar);
    v = inflater.inflate(R.layout.sliding_lock_pager, container, false);

    // other code here
    return v;
}

public static FirstFragment newInstance(String text) {

    FirstFragment f = new FirstFragment();
    Bundle b = new Bundle();
    b.putString("msg", text);
    f.setArguments(b);

    return f;
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    return false;
}

} 第三个文件 在此处输入代码 公共类 SecondFragment 扩展 Fragment 实现 OnClickListener {

// all varible decalare here
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    getActivity().setTheme(android.R.style.Theme_Light_NoTitleBar);
    View v = inflater.inflate(R.layout.password, container, false);

    // other code here
    // this method move to main pager 
    txtBack.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            final android.support.v4.app.FragmentTransaction ft = getFragmentManager()
                    .beginTransaction();

                ft.replace(R.id.layputMainPager, new FirstFragment(),
                        "NewFragmentTag");
                ft.addToBackStack(null);
                ft.commit();
        }
    });

    return v;
}

public static SecondFragment newInstance(String text) {

    SecondFragment f = new SecondFragment();
    Bundle b = new Bundle();
    b.putString("msg", text);
    f.setArguments(b);
    return f;
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub

}

}

   See in secondFragment class when i back through back button then i want to scroll again to that page i not do that. i move again to that page though page scroll. and in ft.replace(R.id.layputMainPager, new FirstFragment()) R.id.layputMainPager is  `class ViewPagerMainActivity` class xml files a

主布局ID。

【问题讨论】:

  • 请分享您的代码..
  • 请 rahul 帮我在上面显示我的代码

标签: android android-viewpager fragment


【解决方案1】:

几天前我也遇到了同样的问题,我认为您正在混合两种不同的实现:

  1. 如果您在 ViewPager 中使用片段。您可以使用 ViewPager 的 setCurrentItem() 方法移动到下一个或上一个片段。

  2. 如果您只使用片段然后在片段之间移动,您可以使用 FragmentTransaction 类方法,如 replace()、add() 等。

希望这能解决问题。如果仍有不清楚的地方,请分享代码。

编辑

您可以重载 onBackPressed() 方法,例如:

@Override
public void onBackPressed() {
    // you can also check for current viewpager item by 
    // mViewpager.getCurrentItem()  
     mViewPager.setCurrentItem(precFragment, true);

}

如果您在片段中添加了按钮,您可以执行以下操作:

Button back =  (Button) rootView.findViewById(R.id.back_button);
back.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ((YourActivity)getActivity()).mViewPager.setCurrentItem(prevFragment);

        }
    });

编辑:添加代码

  public class MainActivity extends Activity {

/**
 * The {@link android.support.v4.view.PagerAdapter} that will provide
 * fragments for each of the sections. We use a {@link FragmentPagerAdapter}
 * derivative, which will keep every loaded fragment in memory. If this
 * becomes too memory intensive, it may be best to switch to a
 * {@link android.support.v13.app.FragmentStatePagerAdapter}.
 */
SectionsPagerAdapter mSectionsPagerAdapter;

/**
 * The {@link ViewPager} that will host the section contents.
 */
ViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Create the adapter that will return a fragment for each of the three
    // primary sections of the activity.
    mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager());

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public void onBackPressed() {

     mViewPager.setCurrentItem(0, true);

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

/**
 * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
 * one of the sections/tabs/pages.
 */
public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
        case 0:
            return new FirstFragment();
        case 1:
            return new SecondFragment();
        default:
            break;
        }
        return null;
    }

    @Override
    public int getCount() {
        return 2;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        Locale l = Locale.getDefault();
        switch (position) {
        case 0:
            return getString(R.string.title_section1).toUpperCase(l);
        case 1:
            return getString(R.string.title_section2).toUpperCase(l);
        }
        return null;
    }
}

 }

第一个片段文件

  public class FirstFragment extends Fragment {
/**
 * The fragment argument representing the section number for this
 * fragment.
 */
private static final String ARG_SECTION_NUMBER = "section_number";

/**
 * Returns a new instance of this fragment for the given section number.
 */
public static FirstFragment newInstance(int sectionNumber) {
    FirstFragment fragment = new FirstFragment();
    Bundle args = new Bundle();
    args.putInt(ARG_SECTION_NUMBER, sectionNumber);
    fragment.setArguments(args);
    return fragment;
}

public FirstFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_first, container,
            false);
    Button next =  (Button) rootView.findViewById(R.id.button1);
    next.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            ((MainActivity)getActivity()).mViewPager.setCurrentItem(1);

        }
    });
    return rootView;
}
}

SecondFragment 文件

 public class SecondFragment extends Fragment {
/**
 * The fragment argument representing the section number for this
 * fragment.
 */
private static final String ARG_SECTION_NUMBER = "section_number";

/**
 * Returns a new instance of this fragment for the given section number.
 */
public static SecondFragment newInstance(int sectionNumber) {
    SecondFragment fragment = new SecondFragment();
    Bundle args = new Bundle();
    args.putInt(ARG_SECTION_NUMBER, sectionNumber);
    fragment.setArguments(args);
    return fragment;
}

public SecondFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.second_fragment, container,
            false);

    Button back =  (Button) rootView.findViewById(R.id.button1);
    back.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            ((MainActivity)getActivity()).mViewPager.setCurrentItem(0);

        }
    });
    return rootView;
}
 }

请查看 SecondFragment 文件中的 onBackPressed() 方法和 back.setOnClickListener()。 希望这会有所帮助

【讨论】:

  • @nikiIgeniusDev 我已经编辑了我之前的答案。请检查
  • 但是我在第一个 xml 文件和后面的视图寻呼机在第二个片段类中,所以我如何在第二个片段中使用 ((YourActivity)getActivity()).mViewPager.setCurrentItem(prevFragment);
  • 我没有看到你的 mViewPager 但我想它必须在 ViewPagerMainActivity 文件中。所以你可以使用 ((ViewPagerMainActivity)getActivity()).mViewPager.setCurrentItem(prevFragment);
  • 哦.. 谢谢.. 非常感谢我在第二个片段中使用((YourActivity)getActivity()).mViewPager.setCurrentItem(0); 完成了它,再次感谢我解决了它。
  • 感谢您在上面的帮助回答我想在页面滚动时添加动画或使用((YourActivity)getActivity()).mViewPager.setCurrentItem(prevFragment); 例如当页面移动时我想放像放大-缩小这样的动画,淡出任何一个你知道怎么做的人。由于代码大,我不会再问它,所以请帮助我
【解决方案2】:

接口有更好的实现。

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_first, container, false);
    Button next = (Button) rootView.findViewById(R.id.button1);
    next.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            ((MainActivity) getActivity()).mViewPager.setCurrentItem(1);

        }
    });
    return rootView;
}

应该替换为: 片段文件

public class FirstFragment extends Fragment {

private static final String ARG_SECTION_NUMBER = "section_number";

private OnSetCurrentItemListener mListener;
private int mSection;

public interface OnSetCurrentItemListener {
    void onGotoItem(int position);
}


public static FirstFragment newInstance(int sectionNumber) {
    FirstFragment fragment = new FirstFragment();
    Bundle args = new Bundle();

    args.putInt(ARG_SECTION_NUMBER, sectionNumber);
    fragment.setArguments(args);
    return fragment;
}


// This method pass a listener to the activity through Fragment LifeCycle creation.
// No needs to cast you Activity cause the method bring it; 
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        mListener = (OnSetCurrentItemListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString() + " needs to implement OnSetCurrentItemListener");
    }
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Bundle extras = getArguments();
    mSection = extras.getInt(ARG_SECTION_NUMBER);
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_first, container, false);
    Button next = (Button) rootView.findViewById(R.id.button1);
    next.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            int target = mSection + 1;
            target = (target < 0) ? 0 : target; //checks bounds
            //to go next
            mListener.onGotoItem(mSection + 1);
            //to prev
            //mListener.onGotoItem(mSection - 1);
        }
    });
    return rootView;
}
}

在您的活动文件上:

public class ViewPagerMainActivity extends FragmentActivity implements OnSetCurrentItemListener {

...

@Override
public void onGotoItem(int position) {
    mViewPager.setCurrentItem(position);

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    相关资源
    最近更新 更多