2014-01-10 278 views
0

我有一個帶有兩個按鈕的主活動類。按下的按鈕將int []和int發送到片段活動,該活動由該活動中的特定片段訪問。在嘗試將活動的意圖發送到片段活動時,我會收到空​​指針異常,並從片段中的片段活動中檢索一個包。我知道這個解釋聽起來有點混亂,這裏是我的代碼:Android,將活動傳遞給片段活動,片段

從我的主要活動:

vessel.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View arg0) { 
       //System.out.println(vessel.getText().toString()+" pushed"); 
       int id = j; 
       datasource.openRead(); 
       trips = datasource.tripsWithVesselId(id); 
       datasource.close(); 
       Intent frags = new Intent(MainActivity.this, FragmentMenu.class); 
       frags.putExtra("trips", trips); 
       frags.putExtra("id", id); 
       startActivity(frags); 
      } 
     }); 

從FragmentMenu:

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


    mSectionsPagerAdapter = new SectionsPagerAdapter(
      getSupportFragmentManager()); 
    mViewPager = (ViewPager) findViewById(R.id.pager); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 
    if(savedInstanceState != null) 
    { 
     TripReportsFragment frag = new TripReportsFragment(); 
     frag.setArguments(getIntent().getExtras()); 
     getSupportFragmentManager().beginTransaction().add(android.R.id.content, frag).commit(); 
    } 
} 

從我的碎片類別:

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

    Bundle bundle = getArguments(); 
    if (bundle != null) { 
     trips = getArguments().getIntArray("trips"); 
     vessel = getArguments().getInt("id");   
    } 
    System.out.println(vessel+" vessel id from mainactivity"); 
    View rootView = inflater.inflate(R.layout.fragment_trip, 
      container, false); 
    Button newTrip = (Button) rootView.findViewById(R.id.newTrip); 
    Button pastTrips = (Button) rootView.findViewById(R.id.pastTrip); 
    newTrip.setOnClickListener(this); 
    pastTrips.setOnClickListener(this); 
    return rootView; 
} 

我的船隻ID從片段類返回0,所以我知道這個包是空的。我對碎片非常不熟悉,所以任何見解都會非常有幫助,謝謝!

編輯:

我已經改變了代碼爲SectionPagerAdapter內改變,現在看起來是這樣的:

public Fragment getItem(int position) { 
     // getItem is called to instantiate the fragment for the given page. 
     // Return a DummySectionFragment (defined as a static inner class 
     // below) with the page number as its lone argument. 
     switch (position) { 
     case 0: 
      TripReportsFragment frag = new TripReportsFragment(); 
      frag.setArguments(getIntent().getExtras()); 
      getSupportFragmentManager().beginTransaction().add(android.R.id.content, frag).commit(); 
      return frag; 
     case 1: 
      return new InactivityReportFragment(); 
     case 2: 
      return new SpeciesFragment();  
     } 
     return null; 
    } 

現在我得到一個新的錯誤:

01-10 14:26:04.915:E/AndroidRuntime(2538):java.lang.IllegalStateException:無法更改片段TripReportsFragment的容器ID {b1da3798 id = 0x1020002 android:switcher:2131230762:0}:現在是16908290現在2131230762

對此錯誤的觀點?

回答

0

從你給什麼,你在這裏只設置參數:

if(savedInstanceState != null) 
    { 
     TripReportsFragment frag = new TripReportsFragment(); 
     frag.setArguments(getIntent().getExtras()); 
     getSupportFragmentManager().beginTransaction().add(android.R.id.content, frag).commit(); 
    } 

savedInstanceState僅在配置更改爲非空,所以最初的片段將沒有參數設置。您的分段是從佈局文件初始化的嗎? - 它是否在mSectionsPagerAdapter中創建?如果是這樣,也許你不在那裏調用setArguments?

+0

我說實話也不太清楚。我在研究我的問題時看到了另一個代碼exerpt中的savedInstanceState!= null行。就像我說的,我對碎片的工作方式非常不熟悉。碎片在派生自mSectionsPagerAdapter的SectionsPagerAdapter中返回。所有發生在那裏的是一個帶有switch語句的getItem()方法,它簡單地返回一個新的片段,因此返回新的TripReportsFragment(); –

+0

您應該在SectionsPagerAdapter中創建的片段實例上調用setArguments,否則getArguments將返回空指針。另外我不認爲你需要這裏的代碼if(savedInstanceState!= null){....},片段應該處理自身的配置更改。 – marcinj

+0

我在這裏假設TripReportsFragment在你的viewpager中,但這可能不是真的。 – marcinj

0

您需要刪除:

getSupportFragmentManager().beginTransaction().add(android.R.id.content, frag).commit(); 

來自:

case 0: 
     TripReportsFragment frag = new TripReportsFragment(); 
     frag.setArguments(getIntent().getExtras()); 
     getSupportFragmentManager().beginTransaction().add(android.R.id.content, frag).commit(); 
     return frag; 

成爲:

case 0: 
     TripReportsFragment frag = new TripReportsFragment(); 
     frag.setArguments(getIntent().getExtras()); 
     return frag;