2013-12-22 33 views
2

我有一个活动,包含2个片段,一个列表和一个细节。我想要做的是,无论何时单击列表项目,相关参数都将被发送到详细片段。但我无法实现。通过viewpager片段之间传递参数

下面是活动:

public class ActivityMain extends ActionBarActivity{ 

/** 
* 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.v4.app.FragmentStatePagerAdapter}. 
*/ 
SectionsPagerAdapter mSectionsPagerAdapter; 

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

List<String> naviList = new ArrayList<String>(); 
ViewPager mViewPager; 
private ActionBarDrawerToggle drawerToggle; 
private DrawerLayout drawer; 
ListView navList; 
DrawerAdapter naviAdapter; 
private static final int GRAVITY = Gravity.LEFT; 
private static final String jsonURL = ""; 
List<String> categories = new ArrayList<String>(); 
int check = -1, listCheck = 0; 
Dialog d; 

@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(getSupportFragmentManager()); 

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

    //some methods (e.g. navi-drawer etc.) 


} 

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    // Sync the toggle state after onRestoreInstanceState has occurred. 
    drawerToggle.syncState(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    drawerToggle.onConfigurationChanged(newConfig); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.medicalendar_main, menu); 
    return 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. 
    switch (item.getItemId()) { 
     case R.id.action_settings: 
      return true; 
    } 
    if (drawerToggle.onOptionsItemSelected(item)) { 
     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 ListFragment.newInstance("FirstFragment, Default"); 
      case 1: 
       return DetailFragment.newInstance("DetailFragment, Detail"); 

      default: 
       return ListFragment.newInstance("FirstFragment, Default"); 
     } 
    } 

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

private boolean version() { 
    if (Build.VERSION.SDK_INT > 11) { 
     return true; 
    } else { 
     return false; 
    } 
} 

我的列表片段:

public class ListFragment extends Fragment { 

ListView list; 
LazyAdapter adapter; 
List<String> naviList = new ArrayList<String>(); 
RelativeLayout loading; 
EventsParser parser; 
List<Event> events = new ArrayList<Event>(); 

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

    parser = new EventsParser(""); 
    events = parser.getITEMS(); 
    list = (ListView) v.findViewById(R.id.list); 
    adapter = new LazyAdapter(getActivity(), events); 
    list.setAdapter(adapter); 
    return v; 
} 

public static ListFragment newInstance(String text) { 

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

    return f; 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      ViewPager vp = (ViewPager) getActivity().findViewById(R.id.pager); 
      //clicked item's data to pass next page. 
      vp.setCurrentItem(1); 
     } 
    }); 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
} 

我的详细信息片段:

public class DetailFragment extends Fragment { 

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



    ImageButton imageButton = (ImageButton) v.findViewById(R.id.d_map); 
    imageButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Toast.makeText(getActivity().getApplicationContext(), "Navigating...", Toast.LENGTH_LONG).show(); 
     } 
    }); 

    return v; 
} 

public static DetailFragment newInstance(String text) { 

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

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 

} 

如果你能帮助我,我将大大appriciated。

最好,

回答

1

基本上,你不需要ViewPager从一个片段导航到另一个片段。这应该通过使用FragmentTransaction类替换片段来实现,这将允许您在事务中传递参数。 http://developer.android.com/reference/android/app/FragmentTransaction.html

如果您仍需要ViewPager,你应该设置标签与 fragment.setTag("detail_fragment"); 和比你onListItemClick方法每个片段应该是这样的:

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      //get detail fragment instance by it's tag 
      DetailFragment detail = (DetailFragment) getActivity().getFragmentManager().findFragmentByTag("detail_fragment"); 
      detail.setParam("data"); //you should define this method in your detail fragment 
      ViewPager vp = (ViewPager) getActivity().findViewById(R.id.pager); 
      //clicked item's data to pass next page. 
      vp.setCurrentItem(1); 
     } 
+0

非常感谢您的answer.This仅用于发送参数到我的详细片段,如果我没有错。那么我如何在我的细节片段中获取这些值呢? –

+0

对不起,先生,我无法得到你在这里的意思: detail.setParam(“data”); //您应该在您的详细片段中定义此方法 –

+0

要将任何参数传递给详细片段,您需要引用片段类的实例。这是通过findFragmentByTag()方法实现的。比你想要在你的详细片段类中创建新方法并从列表片段中调用它。我认为这个方法可以有一个字符串参数的setData()名称。但是你应该创建任何你需要的方法。 –