【问题标题】:How to pass data from one swipe tab to another?如何将数据从一个滑动选项卡传递到另一个?
【发布时间】:2015-03-21 09:43:57
【问题描述】:

我需要将两个字符串从第一个选项卡传递到第二个选项卡。虽然我写了这段代码:

 Map map = new Map();
            Bundle bundle = new Bundle();
            bundle.putString("Position", intent.getStringExtra("Position"));
            map.setArguments(bundle);
            Toast.makeText(context,"Visualizzare la posizione sulla mappa",Toast.LENGTH_SHORT).show();

在第一堂课,这段代码:

 Bundle args = getArguments();

    if(args != null)
    {
     Toast.makeText(getActivity().getBaseContext(),"Non è null",Toast.LENGTH_SHORT).show();
     String pos=args.getString("Position");
     String id=args.getString("ID");
    }

在第二节课中,我的应用程序崩溃了。我不明白为什么。 我搜索了很多以找到原因,但我不明白我该怎么做。 你能告诉我如何将这两个字符串从第一个片段传递到第二个片段吗? 非常感谢

【问题讨论】:

  • 但只发送Position 并尝试获取PositionID
  • 为什么不将数据保存在SharedPreferences 中?
  • 不,我需要发送这两个字符串...

标签: android android-fragments bundle


【解决方案1】:

要在片段之间进行通信,您必须遵循以下流程: - 您必须在片段和父活动之间定义接口通信器,然后通过捆绑中的设置参数传递您的数据。

定义片段之间的接口通信器:http://developer.android.com/training/basics/fragments/communicating.html

设置参数:

Fragment fragment = new Fragment();
 final Bundle bundle = new Bundle();
 bundle.putString("data", data);
 Log.i("BUNDLE", bundle.toString());
 fragment.setArguments(bundle); 

流程如下:FragmentA --Data--> FragmentActivity --Data--> FragmentB

1 - 从片段定义接口通信器回调

interface communicate {
  public void sendData(String data);
} 

2 - 在父活动中实现这个通信器

import android.os.Bundle;

import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;

public class MainActivity extends FragmentActivity implements communicate{

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

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

    @Override
    public void sendData(String data) {
        // TODO Auto-generated method stub

    // From fragments we can call this method with the help of reference of communicate. 
    }

}

3 - 在第一个片段子中,我们必须从创建的活动中获取通信器的实例:

public class FragmentA extends Fragment implements OnClickListener{
 Button button;
 communicate cm;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub

        return inflater.inflate(R.layout.layout_fragmenta, container, false);
    }



    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);
        **cm = (communicate) getActivity();**
        button = (Button) getActivity().findViewById(R.id.button1);
        button.setOnClickListener(this);
    }



    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub

        cm.sendData();
    }

}

4 - 在您的父活动中,您从方法 sendData 获取数据并通过 Bundle 将数据传递给 fragmentB:

@Override
        public void sendData(String data) {
            // TODO Auto-generated method stub

      Fragment fragment = new Fragment();
     final Bundle bundle = new Bundle();
     bundle.putString("data", data);
     Log.i("BUNDLE", bundle.toString());
     fragment.setArguments(bundle); 
        }

5 - 最后;通过 get arguments 方法从 FragmentB 获取数据:

公共类 ExampleFragment 扩展 Fragment {

public static FragmentB newInstance()
{
    FragmentB fragment = new FragmentB();

    // arguments
    Bundle arguments = new Bundle();
    arguments.putString(ARGUMENT_PRODUCT_ID, productId);
    fragment.setArguments(arguments);

    return fragment;
}

public FragmentB() {}

@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    // handle fragment arguments
    Bundle arguments = getArguments();
    if(arguments != null)
    {
    }

}

}

【讨论】:

  • 我如何从父活动发送数据?
  • 再看我的回答
  • 我不明白5点..为什么我需要以这种方式声明片段?
  • fragmentA代表第一个Tab,fragmentB代表第二个Tab
猜你喜欢
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多