2014-03-14 25 views
1

我是新來的android。我遵循這個tutorial來實現Simple Rss Reader。在這裏,在SplashActivity期間,它從網絡獲取提要並將其傳遞給下一個活動,即「ListActivity」。將Activity從活動發送到Swipe Tab之一?

現在,我已經實現了3個Tabs的Swipe Tab,我想發送來自SplashActivity的Bundle來更新第二個Tab中的列表視圖。

下面是一些的代碼,

SplashActivity.java

public class SplashActivity extends Activity { 

private String RSSFEEDURL = "rss feed link goes here"; 
RSSFeed feed; 

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

    setContentView(R.layout.splash); 

    ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    if (conMgr.getActiveNetworkInfo() == null 
      && !conMgr.getActiveNetworkInfo().isConnected() 
      && !conMgr.getActiveNetworkInfo().isAvailable()) { 
     // No connectivity - Show alert 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setMessage(
       "Unable to reach server, \nPlease check your connectivity.") 
       .setTitle("TD RSS Reader") 
       .setCancelable(false) 
       .setPositiveButton("Exit", 
         new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, 
            int id) { 
           finish(); 
          } 
         }); 

     AlertDialog alert = builder.create(); 
     alert.show(); 

    } else { 
     // Connected - Start parsing 
     new AsyncLoadXMLFeed().execute(); 

    } 

} 

private class AsyncLoadXMLFeed extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 

     // Obtain feed 
     DOMParser myParser = new DOMParser(); 
     feed = myParser.parseXml(RSSFEEDURL); 
     return null; 

    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 

     Bundle bundle = new Bundle(); 
     bundle.putSerializable("feed", feed); 

     // launch List activity 
     Intent intent = new Intent(SplashActivity.this, MainActivity.class); 
     intent.putExtras(bundle); 
     startActivity(intent); 

     // kill this activity 
     finish(); 
    } 

} 

} 

MainActivity

public class MainActivity extends FragmentActivity implements 
    ActionBar.TabListener { 

private ViewPager viewPager; 
private TabsPagerAdapter mAdapter; 
private ActionBar actionBar; 
RSSFeed feed; 

    // Tab titles 
private String[] tabs = { "Home", "Updates", "CastandCrew" }; 

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


    // Initilization 
    viewPager = (ViewPager) findViewById(R.id.pager); 
    actionBar = getActionBar(); 
    mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); 

    viewPager.setAdapter(mAdapter); 
// actionBar.setHomeButtonEnabled(false); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);   

    // Adding Tabs 
    for (String tab_name : tabs) { 
     actionBar.addTab(actionBar.newTab().setText(tab_name) 
       .setTabListener(this)); 
    } 

    /** 
    * on swiping the viewpager make respective tab selected 
    * */ 
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

     @Override 
     public void onPageSelected(int position) { 
      // on changing the page 
      // make respected tab selected 
      actionBar.setSelectedNavigationItem(position); 
     } 

     @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) { 
     } 

     @Override 
     public void onPageScrollStateChanged(int arg0) { 
     } 
    }); 
} 

@Override 
public void onTabReselected(Tab tab, FragmentTransaction ft) { 
} 

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    // on tab selected 
    // show respected fragment view 
    viewPager.setCurrentItem(tab.getPosition()); 
} 

@Override 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
} 

} 

TabsPagerAdapter

public class TabsPagerAdapter extends FragmentPagerAdapter { 

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

@Override 
public Fragment getItem(int index) { 

    switch (index) { 
    case 0: 
     // Top Rated fragment activity 
     return new TopRatedFragment(); 
    case 1: 
     // Games fragment activity 
     return new GamesFragment(); 
    case 2: 
     // Movies fragment activity 
     return new MoviesFragment(); 
    } 

    return null; 
} 

@Override 
public int getCount() { 
    // get item count - equal to number of tabs 
    return 3; 
} 

} 

這是GamesFragment類

public class GamesFragment extends Fragment { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.fragment_games, container, false); 

    return rootView; 
} 
} 

回答

0

您正在使用此return new GamesFragment();代碼創建第二個屏幕。你應該在這裏發送數據。

將數據發送到Fragment的最佳方法是使用setArguments。

你應該做的是這樣的:

更改您PagerAdapter到這一點:

public class TabsPagerAdapter extends FragmentPagerAdapter { 

Bundle bundle;  

public TabsPagerAdapter(FragmentManager fm, Bundle bundle) { 
    super(fm); 
    this.bundle = bundle; 
} 

@Override 
public Fragment getItem(int index) { 

    switch (index) { 
    case 0: 
     // Top Rated fragment activity 
     return new TopRatedFragment(); 
    case 1: 
     // Games fragment activity 
     GamesFragment frag = new GamesFragment(); 
     frag.setArguments(bundle); 
     return frag; 
    case 2: 
     // Movies fragment activity 
     return new MoviesFragment(); 
    } 

    return null; 
} 

@Override 
public int getCount() { 
    // get item count - equal to number of tabs 
    return 3; 
} 

} 

使用傳呼機適配器這樣

new TabsPagerAdapter(getSupportFragmentManager(), getIntent().getExtras()); 

在你的GamesFragmentonCreate()功能,你可以得到這樣的數據:

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

    if(getArguments() != null) { 
     DOMParser myParser = getArguments().getSerializable("feed"); 
    } 
} 
+0

我應該在哪裏添加前3個代碼?以上的'\t \t \t return new GamesFragment();'? – user3289108

+0

另外,它說'getIntent()方法未定義爲類型TabsPagerAdapter' – user3289108

+0

如果您使TabsPagerAdapter成爲Activity中的內部類,則可以訪問Intent。或者,如@Raj建議的那樣,您可以發送Bundle getIntent()。在TabsPagerAdapter的構造器中的getExtras(),你可以直接訪問它。我正在更新答案。 – tasomaniac

3

您可以通過2種方式

1種方式。

GamesFragment frag = new GamesFragment(); 
frag.setArguments(getIntent().getExtras()); 

第二種方式。

首先從包中讀取對象。

Object feed; 
Bundle extras = getIntent().getExtras(); 
    if (extras != null) { 
     feed = extras.getParcelable("feed"); 
    } 

mAdapter = new TabsPagerAdapter(getSupportFragmentManager(),feed); 

//首先更改如下所示的TabsPagerAdapter構造函數。將對象發送給GamesFragment構造函數。

public class TabsPagerAdapter extends FragmentPagerAdapter { 

public TabsPagerAdapter(FragmentManager fm, Object feed) { 
    super(fm); 
} 

@Override 
public Fragment getItem(int index) { 

    switch (index) { 
    case 0: 
     // Top Rated fragment activity 
     return new TopRatedFragment(); 
    case 1: 
     // Games fragment activity 
     return new GamesFragment(feed); 
    case 2: 
     // Movies fragment activity 
     return new MoviesFragment(); 
    } 

    return null; 
} 

@Override 
public int getCount() { 
    // get item count - equal to number of tabs 
    return 3; 
} 

} 

//改變構造函數。你可以從構造函數中獲取對象。

public class GamesFragment extends Fragment { 

     public GamesFragment(Object feed) { 
      // TODO Auto-generated constructor stub 
      } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 

      View rootView = inflater.inflate(R.layout.fragment_games, container, false); 

      return rootView; 
      } 
     } 
+1

嗨thnks,當我嘗試第一種方式顯示'方法getIntent()是未定義類型TabsPagerAdapter'。我現在應該怎麼做?同時,讓我嘗試第二種方式。 – user3289108

+1

您需要將FragmentActivity引用發送給構造函數中的TabsPagerAdapter類。像新的TabsPagerAdapter(這個,getSupportFragmentManager()) –

+0

嗨Raj兄弟,我完全不熟悉這一點。請添加代碼並通過'pastebin.com'發送。請請請!我dono在哪裏改變。 – user3289108

相關問題