2013-12-22 32 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()名稱。但是你應該創建任何你需要的方法。 –