【问题标题】:Android, passing Extras from activity, to fragment activity, to fragmentAndroid,将 Extras 从活动传递到片段活动,再到片段
【发布时间】:2014-01-10 19:00:45
【问题描述】:

我有一个带有两个按钮的主要活动类。按下的按钮将 int[] 和 int 发送到片段活动,该活动中的特定片段可以访问该活动。尝试将意图从活动发送到片段活动并从片段的片段活动中检索包时,我遇到了空指针异常。我知道这个解释听起来很混乱,这是我的代码:

来自我的主要活动:

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{b1da3798 id=0x1020002 android:switcher:2131230762:0} 的容器 ID:为 16908290现在是 2131230762

对此错误的看法?

【问题讨论】:

    标签: java android android-activity fragment bundle


    【解决方案1】:

    根据您的显示,您只在此处设置参数:

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

    savedInstanceState 仅在配置更改时为非 null,因此最初您的片段将没有设置任何参数。您的片段是从布局文件初始化的吗? - 它是在 mSectionsPagerAdapter 中创建的吗?如果是这样,也许你没有在那里调用 setArguments?

    【讨论】:

    • 我真的不太确定。我在研究我的问题时看到的另一个代码摘录中看到了 savedInstanceState != null 行。就像我说的,我非常不熟悉片段的工作原理。片段在派生 mSectionsPagerAdapter 的 SectionsPagerAdapter 中返回。发生的所有事情都有一个带有 switch 语句的 getItem() 方法,它只返回一个新片段,所以 return new TripReportsFragment();
    • 您也应该在 SectionsPagerAdapter 中创建的片段实例上调用 setArguments,否则 getArguments 将返回空指针。此外,我认为您不需要在 if(savedInstanceState != null){ .... } 中使用此代码,片段应自行处理配置更改。
    • 我在这里假设 TripReportsFragment 在您的浏览器中,但这可能不是真的。
    • 我编辑了主帖以反映我当前的更改。我把片段 setArguments 放在它被实例化的地方,现在我得到了一个我在上面的帖子中描述的新错误,我不确定它是什么意思。
    • 删除:getSupportFragmentManager().beginTransaction().add(android.R.id.content, frag).commit();来自适配器的线路
    【解决方案2】:

    你需要删除:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多