Java Android,将活动中的额外内容传递到片段活动,再传递到片段
我有一个有两个按钮的主要活动类。按下的按钮将向片段活动发送int[]和int,该活动中的特定片段可以访问该片段活动。当我试图将意图从活动发送到片段活动,并从片段中从片段活动检索捆绑包时,会出现nullpointer异常。我知道这个解释听起来很混乱,以下是我的代码: 从我的主要活动:Java Android,将活动中的额外内容传递到片段活动,再传递到片段,java,android,android-activity,fragment,bundle,Java,Android,Android Activity,Fragment,Bundle,我有一个有两个按钮的主要活动类。按下的按钮将向片段活动发送int[]和int,该活动中的特定片段可以访问该片段活动。当我试图将意图从活动发送到片段活动,并从片段中从片段活动检索捆绑包时,会出现nullpointer异常。我知道这个解释听起来很混乱,以下是我的代码: 从我的主要活动: vessel.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) {
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);
}
});
从碎片菜单:
@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从fragment类返回0,因此我知道bundle为null。我对片段非常不熟悉,因此任何见解都将非常有用,谢谢
编辑:
我已经在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
关于此错误的看法?根据您的演示,您仅在此处设置参数:
if(savedInstanceState != null)
{
TripReportsFragment frag = new TripReportsFragment();
frag.setArguments(getIntent().getExtras());
getSupportFragmentManager().beginTransaction().add(android.R.id.content, frag).commit();
}
savedInstanceState仅在配置更改时为非null,因此最初您的片段将没有参数集。您的片段是从布局文件初始化的吗?-它是在mSectionsPagerAdapter中创建的吗?如果是这样,可能您没有在那里调用setArguments?您需要删除:
getSupportFragmentManager().beginTransaction().add(android.R.id.content, frag).commit();
发件人:
成为:
case 0:
TripReportsFragment frag = new TripReportsFragment();
frag.setArguments(getIntent().getExtras());
return frag;
老实说,我不太确定。我看到了savedInstanceState!=我在研究问题时看到的另一个代码中的空行。正如我所说,我对片段的工作方式非常不熟悉。片段在mSectionsPagerAdapter派生的SectionsPagerAdapter中返回。所有发生的事情都有一个getItem()方法和一个switch语句,该语句只返回一个新片段,因此返回新的TripReportsFragment();您还应该在SectionsPagerAdapter中创建的片段实例上调用setArguments,否则getArguments将返回null指针。另外,如果(savedInstanceState!=null){……},片段本身应该处理配置更改,我认为您不需要在其中使用此代码。我假设TripReportsFragment在您的viewpager中,但这可能不是真的。我编辑了主要帖子以反映我当前的更改。我把片段setArguments放在实例化的地方,现在我得到了一个我在上面的帖子中描述的新错误,我不确定它的意思。删除:getSupportFragmentManager().beginTransaction().add(android.R.id.content,frag).commit();来自适配器的线路
case 0:
TripReportsFragment frag = new TripReportsFragment();
frag.setArguments(getIntent().getExtras());
return frag;