使用从Activity传递的数据更新Fragment UI

时间:2015-03-17 18:26:49

标签: java android android-fragments android-bundle

我的要求:

我的MainActivity从其他应用收到数据。 MainActivity列为shareable

现在,我需要将此数据传递到fragment中的MainActivity并更新fragment's textview

MainActivity.java:这里,我正在handleSendText方法处理收到的数据(这是一个网址)。

    if (Intent.ACTION_SEND.equals(action) && type != null) {
        if ("text/plain".equals(type)) {
            handleSendText(intent); // Handle text being sent
        }
    }
}

handleSendText中,我正在尝试创建一个包并将该数据传递给我的片段。

void handleSendText(Intent intent) {
    String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
    if (sharedText != null) {

        Bundle bundle = new Bundle();
        bundle.putString("url", sharedText);

   // set Fragmentclass Arguments
        AddTab fragobj = new AddTab(); //AddTab() is my Fragment class's name
        fragobj.setArguments(bundle);
    }

Fragment类中:在onCreateView()

   public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
...
//some code

       Bundle bundle = this.getArguments();

        if(bundle!=null) {

            String sharedUrl = getArguments().getString("url");

            textBox.setText(sharedUrl);

            inflater.inflate(R.layout.fragment_add, container, false);
            // to update the UI to reflect changes, I'm trying the 
           // above line. Is it right?            
        }

1)问题是控件永远不会进入if循环内部,这意味着bundle始终返回NULL

2)此外,如果我没有收到其他应用的数据。我想把我的editText留空,所以我必须执行此检查。我怎么能做到这一点?

3)此外,从setArgument的{​​{3}}开始,我了解到应该在片段附加到其活动之前调用它。那我怎样才能反映片段UI的变化呢?

  

public void setArguments(Bundle args)

     

提供此片段的构造参数。这只能在片段附加到其活动之前调用;也就是说,你应该打电话   它在构建片段后立即生效。提供的论据   这里将保留片段销毁和创建。

2 个答案:

答案 0 :(得分:3)

只需在片段中添加适当的方法,如下所示:

public void receiveURL(String input){
//to handle what you want to pass to the fragment
}

在您的mainActivity调用中,您可以执行以下操作:

YourFragment fragment = (YourFragment)getSupportFragmentManager.findFragmentById(R.id.your_fragment);
fragment.receive(sharedUrl);

答案 1 :(得分:2)

我假设您已经通过fragmentManager.add(..)添加了片段,因此片段已经在布局上了。

如果这是真的,那么你的AddTab fragobj = new AddTab()毫无意义,因为片段已经存在。

您需要在活动中存储对此片段的引用,或使用fragmentManager.findFragmentById()findFragmentByTag()

然后按照Saeed的说法