【问题标题】:Passing a data from Activity to Tabbed Layout Fragment?将数据从活动传递到选项卡式布局片段?
【发布时间】:2016-12-26 05:56:00
【问题描述】:

我有两个活动。一个是包含列表视图的普通活动,第二个是选项卡式布局,它有两个选项卡。一个是“描述”选项卡,另一个是“示例代码”选项卡。

我为每个片段创建了两个单独的片段,即“OneFragment”和“TwoFragment”。我所需要的只是当用户从我的正常活动中单击一个项目时,该项目将存储在字符串中,并且该字符串应该传递给选项卡式布局,它应该显示在 OneFragment 中,即“描述”选项卡

(例如)。如果用户单击 Android,我的列表包含 {"Android","Studio"},此文本应传递到描述选项卡并使用 TextView 显示文本。请帮我。在这里我包括我各自的代码..

NormalActivity - >ListActi.java

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);
        lv = (ListView) findViewById(R.id.listView);
        final List<String> ListElementsArrayList = new ArrayList<String>(Arrays.asList(listElements));
        final ArrayAdapter<String> adapter = new ArrayAdapter<String>
                (getApplicationContext(), android.R.layout.simple_list_item_1, ListElementsArrayList);
        lv.setAdapter(adapter);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //Toast.makeText(getApplicationContext(), listElements[position],Toast.LENGTH_LONG).show();
                s = listElements[position];
                if(position == 1){
                    s = listElements[position];
                    Bundle bundle = new Bundle();
                    bundle.putString("ClickedItem", listElements[position]);
                    OneFragment fragobj = new OneFragment();
                    TwoFragment fag = new TwoFragment();
                    fragobj.setArguments(bundle);
                    fag.setArguments(bundle);
                    Intent i = new Intent(getApplicationContext(),BothLay.class);
                    startActivity(i);
                }
           }
        });
    }
}

TabActivity -> BothLay

public class BothLay extends AppCompatActivity  {
    private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_both_lay);
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);
        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
    }
    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new OneFragment(), "Description");
        adapter.addFragment(new TwoFragment(), "Sample Code");
        viewPager.setAdapter(adapter);
    }
    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();
        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }
        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }
        @Override
        public int getCount(){
            return mFragmentList.size();
        }
        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }
        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }
}

Decription tab ->OneFragment(我只需要将数据从 Normal Activity 传递到此 Fragment)

public class OneFragment extends Fragment{
    String strtext = "Ajay";
    public OneFragment() {
        // Required empty public constructor
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootview = inflater.inflate(R.layout.fragment_one, container, false);
        TextView textView = (TextView) rootview.findViewById(R.id.t1);
        //strtext = getIntent().getStringExtra("ClickedItem"); //this doesn't work  
        textView.setText(strtext);
        return rootview;
    }
}

示例代码选项卡 ->Twofragment

public class TwoFragment extends Fragment{
    public TwoFragment() {
        // Required empty public constructor
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_two, container, false);
    }

}

【问题讨论】:

  • 需要帮助的意思,问我。
  • @Er Ajay Jayendran 首先结束一个句子你只需要一个句号。当你发布一个问题时也要考虑格式,当它非常混乱时人们甚至不会阅读它
  • 是的@Ahamed ..我无法理解您的代码..您可以将这些代码与我的代码链接..提前谢谢..注意:我的正常活动扩展 AppCombatActivity ..不是活动
  • @Charuka 好的兄弟.. 谢谢你的时间:)

标签: java android android-fragments android-intent android-tabactivity


【解决方案1】:

这里:

fragobj.setArguments(bundle);
fag.setArguments(bundle);

在单击 Button 时不起作用,因为当前正在启动 BothLay Activity 而不是将 Fragment 添加到 FragmentManager

要让它工作:

1. 使用 Intent 将 bundle 传递给 BothLay 点击按钮时的活动:

  Intent i = new Intent(getApplicationContext(),BothLay.class);
  i.putExtras(bundle);
  startActivity(i);

2.BothLay Activity 的onCreate 中从Intent 中获取Bundle,然后在调用adapter.addFragment 方法时将其传递给Fragment:

  Bundle bundle = getIntent().getExtras();
  tabLayout.setupWithViewPager(viewPager,bundle);

将 bundle 传递给 Fragment 对象:

   private void setupViewPager(ViewPager viewPager,Bundle bundle) {
        ...
        Fragment fragmentOne=new OneFragment();
        fragmentOne.setArguments(bundle);
        adapter.addFragment(fragmentOne, "Description");
        // do same for second Framgment
   }

编辑:

在 Fragment 的 onCreateView 中调用 getArguments 方法获取数据:

Bundle bundle=getArguments();
if(bundle!=null){
  if(bundle.containsKey("ClickedItem")){
     String strClickedItem=bundle.getString("ClickedItem");
   }
}

【讨论】:

    【解决方案2】:

    执行我提供链接的所有步骤。

    当您的片段恢复时,需要执行第 4 步。

    以下代码将在您的活动中,

    SelectedBundle selectedBundle;

    最后你会在 selectedBundle 上获得片段的实例。

    因此,您可以轻松地将值传递给片段。喜欢,

      fragment.setData(String passedData);
    

    就是这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-31
      • 2018-08-20
      • 1970-01-01
      相关资源
      最近更新 更多