如何在活动和浏览器片段之间传递值? [复制]

Posted

技术标签:

【中文标题】如何在活动和浏览器片段之间传递值? [复制]【英文标题】:How to pass value between activity and viewpager fragment? [duplicate] 【发布时间】:2016-04-23 15:37:21 【问题描述】:

这可能是个愚蠢的问题,但我正在努力解决如何在活动和浏览器之间传递价值。现在让我解释一下我的要求,我有两个选项卡,即任务和调用。当用户按下它将进入新活动时,在任务中有一个按钮,它将有两种形式,一种是edittext,而微调器需要从该活动数据中填充任务片段中的列表视图到目前为止我已经尝试过的是:

这是我的主要活动:

import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity 

    /**
     * The @link android.support.v4.view.PagerAdapter that will provide
     * fragments for each of the sections. We use a
     * @link FragmentPagerAdapter derivative, which will keep every
     * loaded fragment in memory. If this becomes too memory intensive, it
     * may be best to switch to a
     * @link android.support.v4.app.FragmentStatePagerAdapter.
     */
    private SectionsPagerAdapter mSectionsPagerAdapter;

    /**
     * The @link ViewPager that will host the section contents.
     */
    private ViewPager mViewPager;

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

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        // Create the adapter that will return a fragment for each of the three
        // primary sections of the activity.
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        mViewPager = (ViewPager) findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);
        //  Bundle bundle=getIntent().getExtras();
        // Intent intent=getIntent();
        //   ActivityView activityView=(ActivityView)intent.getSerializableExtra("yog");
        //     intent.putExtra("yogs",activityView);
        // Bundle bundle=new Bundle();
        // bundle.putSerializable("yogs",activityView);
        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(mViewPager);
        Bundle bundle = getIntent().getExtras();
        if (bundle != null) 
            String yogan = bundle.getString("yog");
            String yogans = bundle.getString("yogs");
            Bundle bundle1 = new Bundle();
            bundle.putString("yoges", yogan);
            bundle.putString("yogesh", yogans);
            Task task = new Task();
            task.setArguments(bundle1);


        
    

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    

    @Override
    public boolean onOptionsItemSelected(MenuItem item) 
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) 
            return true;
        

        return super.onOptionsItemSelected(item);
    

    /**
     * A placeholder fragment containing a simple view.
     */


    /**
     * A @link FragmentPagerAdapter that returns a fragment corresponding to
     * one of the sections/tabs/pages.
     */
    public class SectionsPagerAdapter extends FragmentPagerAdapter 

        public SectionsPagerAdapter(FragmentManager fm) 
            super(fm);
        

        @Override
        public Fragment getItem(int position) 
            // getItem is called to instantiate the fragment for the given page.
            // Return a PlaceholderFragment (defined as a static inner class below).
                switch (position)
                    case 0:
                            Task task=new Task();
                            return task;

                    case 1:
                            Calls calls=new Calls();
                            return calls;

                
        return null;
        

        @Override
        public int getCount() 
            // Show 3 total pages.
            return 2;
        

        @Override
        public CharSequence getPageTitle(int position) 
           switch (position)
               case 0:
                   return "Task";
               case 1:
                   return "Call";

            
        return null;
            

        
    

这是我的任务片段(列表视图被填充的地方)

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;
public class Task extends Fragment

    List<ActivityView>activityViews;
    ActivityView activityView=new ActivityView();
    ActivityListAdapter activityListAdapter;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 

        View rootview= inflater.inflate(R.layout.yog,container,false);
        ListView listview=(ListView)rootview.findViewById(R.id.listView);
        if (activityViews == null)
        
            activityViews = new ArrayList<ActivityView>();

        
        if(getArguments()!=null) 
            getArguments().getSerializable("yog");
        
        activityViews.add(activityView);
            activityListAdapter = new ActivityListAdapter(getActivity(), R.id.listView, activityViews);
            listview.setAdapter(activityListAdapter);
            activityListAdapter.notifyDataSetChanged();
            Button btn=(Button)rootview.findViewById(R.id.button2);
            btn.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v)
            
                Intent intent = new Intent(getActivity(), DetailActivity.class);
                startActivity(intent);
            
        );



        return rootview;
    

    

这是数据在任务片段中填充列表视图的活动:

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;

public class DetailActivity extends AppCompatActivity 
    ActivityView activityView = new ActivityView();
    // public static String endpoint;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        final EditText editText = (EditText) findViewById(R.id.editText);
        final Spinner spinner = (Spinner) findViewById(R.id.spinner);
        final ArrayAdapter<CharSequence> arrayAdapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array.yog, R.layout.support_simple_spinner_dropdown_item);
        spinner.setAdapter(arrayAdapter);
        final Button btn = (Button) findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                activityView.setDescription(editText.getText().toString());
                activityView.setStatus(spinner.getSelectedItem().toString());
              //  Bundle bundle=new Bundle();
               // bundle.putSerializable("yog", activityView);
                Task task=new Task();
                //task.setArguments(bundle);
                android.support.v4.app. FragmentManager fm=getSupportFragmentManager();
                android.support.v4.app.  FragmentTransaction ft=fm.beginTransaction();
                ft.add(R.id.container,task,"");
                ft.commit();

            
        );
    

这里如何在活动和viewpager片段之间传递数据有人可以帮助我吗?提前致谢!

【问题讨论】:

【参考方案1】:

您可以使用Bundle 将数据从Activity 传递到Fragment

Activity 中,创建您的Bundle 并将其添加到Fragment

Bundle myBundle = new Bundle();
myBundle .putLong( "exampleId", mExampleId);
myBundle .putString("exampleName", mName);
...
myFragment.setArguments( myBundle  );

然后,当 Fragment 创建时,使用函数 getArguments() 获取 Bundle 中的值,例如:

Long exampleId = getArguments().getLong("exampleId");

如果您在Bundle 中找不到密钥,甚至可以设置默认值

String exampleName = getArguments().getString( "exampleName", "None"));

【讨论】:

需要发送不同活动的片段。是不是一样【参考方案2】:

您应该在片段中创建一个 NewInstance 方法。简而言之,它可能看起来像这样:

public class MyFragment 
    private int value;

    private static final String ARG_VALUE = "argValue";

    public static MyFragment NewInstance(int value) 
        Bundle args = new Bundle();
        args.putInt(ARG_VALUE, value);

        MyFragment fragment = new MyFragment();
        fragment.setArguments(args);

        return fragment;
    

    @Override
    public void onCreate() 
        Bundle args = getArguments();
        this.value = args.getInt(ARG_VALUE, 0); // Default 0 if key not found.
    

您只需在创建片段时传入该值:

MyFragment tenFragment = MyFragment.newInstance(10);

然后它可以在片段事务中使用或插入到 FragmentStatePagerAdapter 中,但是您需要它。同样的原则适用于任何数据类型,所以如果你需要传入字符串,或者你自己的可序列化对象等,你可以这样做。

【讨论】:

以上是关于如何在活动和浏览器片段之间传递值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

片段和活动之间没有传递值

如何将数据从一个活动传递到android中的另一个活动片段? [复制]

如何在活动和片段之间传递对象

如何将值从片段/活动传递到 xml?

如何将值从一个活动中的片段传递到另一个活动? [复制]

如何在导航抽屉活动模板中的片段之间传递字符串变量