【问题标题】:Send data from Activity to Fragments将数据从 Activity 发送到 Fragments
【发布时间】:2016-02-01 20:40:29
【问题描述】:

我查看了其他线程,它们都展示了如何在创建片段时执行此操作,而不是异步执行。

我有 3 个活动,每个活动都执行异步 okhttp3.HttpUrl 获取,以便从第三方 JSON API 接收数据。然后在完成后,它将用数据填充活动。

我已经将这 3 个活动转换为片段并将它们放入父活动中。但是,这意味着每次我加载新的父 Activity 时,它都会进行 3 次 okhttp3.HttpUrl 提取以填充 3 个片段。

所有三个获取都转到同一个 URL,所以我想改为将 okhttp3.HttpUrl 请求放在父活动中,一旦完成,将整个 JSON 包发送到片段。这是在创建片段之后...所以我不知道该怎么做...

有什么想法吗?

我的家长活动:

public class ChallongeEvent extends AppCompatActivity {
    private TextView tab_text;
    private String EVENT_ID, URL;

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

        init();
    }

    private void init() {
        tab_text = (TextView) findViewById(R.id.tab_text);

        Intent intent = getIntent();
        EVENT_ID = intent.getStringExtra("event_id");

        if (Challonge.SUBDOMAIN.isEmpty()) {
            URL = "https://api.challonge.com/v1/tournaments/" + EVENT_ID + ".json";
        } else {
            URL = "https://api.challonge.com/v1/tournaments/" + Challonge.SUBDOMAIN + "-" + EVENT_ID + ".json";
        }

        String titles[] = new String[] { getString(R.string.players), getString(R.string.matches) };
        int numTabs = intent.getIntExtra("num_tabs", 1);

        EventAdapter adapter = new EventAdapter(getSupportFragmentManager(), titles, numTabs);
        ViewPager pager = (ViewPager) findViewById(R.id.pager);
        pager.setAdapter(adapter);
        pager.setCurrentItem(intent.getIntExtra("num_tabs", 1) - 1);

        SlidingTabLayout sliding_tabs = (SlidingTabLayout) findViewById(R.id.sliding_tabs);
        sliding_tabs.setDistributeEvenly(true);
        sliding_tabs.setViewPager(pager);
    }

    private void populate() {
        AsyncGet fetch = new AsyncGet(new AsyncResponse() {
            @Override
            public void processFinish(String output) {
            }
        });

        HttpUrl.Builder urlBuilder = HttpUrl.parse(URL).newBuilder();
        urlBuilder.addQueryParameter("api_key", Challonge.API_KEY);
        urlBuilder.addQueryParameter("include_participants", "1");
        urlBuilder.addQueryParameter("include_matches", "1");
        fetch.execute(urlBuilder.build().toString());
    }

    public void setTabText(String text) {
        tab_text.setText(text);
    }
}

class EventAdapter extends FragmentPagerAdapter {
    private final String[] titles;
    private final int numTabs;

    public EventAdapter(FragmentManager fm, String mTitles[], int mNumTabs) {
        super(fm);

        this.titles = mTitles;
        this.numTabs = mNumTabs;
    }

    @Override
    public Fragment getItem(int position) {
        switch (position)
        {
            case 1:
                return new ChallongeMatches();
            default:
                return new ChallongePlayers();
        }
    }

    @Override
    public String getPageTitle(int position) {
        return titles[position];
    }

    @Override
    public int getCount() {
        return numTabs;
    }
}

【问题讨论】:

  • 我认为,EventBus 可以在这里为您提供帮助(在 Activity 和 Fragments 之间进行通信,或者例如在不同的 Fragment 之间进行通信) - 看看:stackoverflow.com/questions/34199714/…

标签: android android-fragments


【解决方案1】:

请试试这个代码

Bundle bundle = new Bundle();
bundle.putString("key", "value");
// to send object use below code
// bundle.putSerializable("key", object);
Fragment fragment = new Fragment();
fragment.setArguments(bundle);
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();

在代码下方获得价值使用

String value= getIntent().getExtras().getString("value");

或

Object object = getIntent().getExtras().getSerializable("value");

【讨论】:

  • 你能详细解释一下吗?我把这段代码放在哪里?我希望将数据发送到每个片段。我已经用我的父活动中的代码更新了我的第一篇文章。
  • 相对于我在上面发布的代码,我应该将这些代码放在哪里?我试图把它放在processFinish,但它无法解析“容器”。
  • 基本上,在我的父活动的processFinish 中,我需要将数据发送到所有片段......此时片段已经创建,因为它是一个AsyncTask,所以创建一个@ 987654326@ 可能行不通。
【解决方案2】:

您还可以使用LocalBroadcastManager 将数据发送到所有三个片段。这里还有一个tutorial,关于如何使用它。这样做的好处是,即使没有人在收听,您也可以发送数据,并且无需更改发送方的任何内容即可轻松添加另一个接收方。

【讨论】:

    【解决方案3】:

    自己解决了...在我的 AsyncFetch 调用中:

        AsyncGet fetch = new AsyncGet(new AsyncResponse() {
            @Override
            public void processFinish(String output) {
                for (Fragment fragment : getSupportFragmentManager().getFragments())
                {
                    if (fragment instanceof ChallongePlayers) {
                        ((ChallongePlayers) fragment).parsePlayers(output);
                    } else if (fragment instanceof ChallongeMatches) {
                        ((ChallongeMatches) fragment).parseMatches(output);
                    }
                }
            }
        });
    

    这会解析活动中所有可能的片段并将数据发送到特定的操作。

    【讨论】:

      【解决方案4】:

      在每个片段中创建一个方法:

      public void setData(Bundle bundle){
      //set you data to a local variable,
      //and set it to the views on creation, 
      //OR
      //call this method on Post execute of your async task
      }
      

      然后在主要活动中:

      YourFragment fragment = new YourFragment;
      fragment.setData(bundle);
      getSupportFragmentManager().replace(R.id.frame, fragment).commit;
      

      或 在异步任务的 onPostExecute() 上调用 fragment.setData(bundle)

      【讨论】:

      • 我对它的工作原理感到困惑......如何从包中放置和获取数据?
      • 您能详细解释一下吗?我在哪里将文本放在主要活动中?它怎么知道要去哪个片段?
      • 为此,您应该让您的片段使用这种方法扩展一个基本片段,然后将片段转换为基本片段以便调用该方法。您提出的代码将失败,因为裸 Fragment 不包含 setData 方法。
      • 当然,很明显Fragment指的是用户的自定义片段,不过我已经编辑过了
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-26
      • 2013-09-27
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多