在片段及其容器活动之间传递数据

tyb*_*tyb 167 android android-fragments

如何在片段及其容器活动之间传递数据?是否有类似于通过意图在活动之间传递数据的东西?

我读了这个,但它没有多大帮助:http:
//developer.android.com/guide/topics/fundamentals/fragments.html#CommunicatingWithActivity

Har*_*mes 288

尝试使用接口.

应将数据传递回其包含活动的任何片段都应声明一个接口来处理和传递数据.然后确保包含的活动实现了这些接口.例如:

在你的片段中,声明接口...

public interface OnDataPass {
    public void onDataPass(String data);
}
Run Code Online (Sandbox Code Playgroud)

然后,将包含类的接口实现连接到onAttach方法中的片段,如下所示:

OnDataPass dataPasser;

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    dataPasser = (OnDataPass) context;
}
Run Code Online (Sandbox Code Playgroud)

在您的片段中,当您需要处理数据传递时,只需在dataPasser对象上调用它:

public void passData(String data) {
    dataPasser.onDataPass(data);
}
Run Code Online (Sandbox Code Playgroud)

最后,在你的包含活动中实现 OnDataPass ......

@Override
public void onDataPass(String data) {
    Log.d("LOG","hello " + data);
}
Run Code Online (Sandbox Code Playgroud)

  • 这绝对是我想去的唯一方法.并提供Activity和Fragment之间的双向交互.当您在一个活动中有多个片段时,无论是通过制表符还是多片段布局,还将允许一种方法在片段之间进行通信. (4认同)
  • 谢谢很好的回答,说到点子上了。[这里](http://developer.android.com/training/basics/fragments/communicating.html)也很好地解释了这一点。我没有意识到你可以实现多个接口,我已经实现了一个`ActionBar.TabListener`,不得不添加一个额外的接口。 (3认同)
  • 为什么有人需要一个额外的界面来做到这一点?为什么您认为以下解决方案不好或您的解决方案更好?((MyActivity)getActivity).myMethod(...) (3认同)
  • onAttach(活动活动)已弃用,请改用onAttach(Context context). (3认同)
  • 我想知道一些事情......这是官方答案,从官方开发人员网站他们说这是沟通 frag-act-frag 的正确方法,但为什么甚至可以通过强制转换 getActivity( )? (2认同)

Nic*_*ick 200

在你的片段中你可以打电话getActivity().

这将使您可以访问创建片段的活动.从那里你可以明显地调用活动中的任何类型的访问器方法.

例如,对于getResult()您的活动调用的方法:

((MyActivity) getActivity()).getResult();
Run Code Online (Sandbox Code Playgroud)

  • 由于您正在访问YOUR Activity中的函数(而不是父Android活动),因此您需要转换getActivity()调用:((MyActivity)getActivity()).getResult(); (85认同)
  • @VasilValchev,你可以创建一个接口并强制活动来实现它,然后从你的片段中调用一个方法来传递数据.使用onAttach方法检查活动是否实现了接口. (6认同)
  • 这不是一种好的做法,也不是一种模式.接口的答案是正确的. (6认同)
  • 从片段到活动,后面的方法怎么可能? (3认同)
  • 来自@IvanNikolov的优秀答案.您可以在[Fragments Training Link](http://developer.android.com/training/basics/fragments/communicating.html)上找到详尽的解释. (3认同)

Xar*_*mer 22

最简单的方法,但不推荐

您可以从片段访问活动数据:

活动:

public class MyActivity extends Activity {

    private String myString = "hello";

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

    public String getMyData() {
        return myString;
    }
}
Run Code Online (Sandbox Code Playgroud)

分段:

public class MyFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        MyActivity activity = (MyActivity) getActivity();
        String myDataFromActivity = activity.getMyData();
        return view;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这会增加您的代码的高耦合,这是一个不好的做法.现在你不能在除"MyActivity"之外的任何Activity中使用Fragment (4认同)

Jee*_*etu 21

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    Bundle b = getActivity().getIntent().getExtras();
            wid = b.getString("wid");
            rid = b.getString("rid");
            View view = inflater.inflate(R.layout.categoryfragment, container, false);
    return view;
 }
Run Code Online (Sandbox Code Playgroud)

  • 这是如何在片段中获取它,但是如果在xml布局文件中有片段,如何在调用片段的类中设置它. (13认同)

Jor*_*sys 16

在片段及其容器活动之间传递数据

活动:

        Bundle bundle = new Bundle();
        bundle.putString("message", "Alo Elena!");
        FragmentClass fragInfo = new FragmentClass();
        fragInfo.setArguments(bundle);
        transaction.replace(R.id.fragment_single, fragInfo);
        transaction.commit();
Run Code Online (Sandbox Code Playgroud)

分段:

读取片段中的值

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        String myValue = this.getArguments().getString("message");
        ...
        ...
        ...
        }
Run Code Online (Sandbox Code Playgroud)


小智 6

我不知道这是不是最好的方法Bu我一直在google上搜索了一段时间,我发现如何将一个Bundle从一个片段传递给它的容器活动,但我发现所有这些都是将数据从活动发送到片段而不是(因为我是新手,这对我来说有点混乱).

后来我尝试了自己的东西,这对我来说非常有用.所以我会在这里发布一些像我这样的人寻找同样的事情.

//从Fragment传递数据.

Bundle gameData = new Bundle();
        gameData.putStringArrayList(Constant.KEY_PLAYERS_ARR,players);
        gameData.putString(Constant.KEY_TEAM_NAME,custom_team_name);
        gameData.putInt(Constant.KEY_REQUESTED_OVER,requestedOver);

        Intent intent = getActivity().getIntent();
        intent.putExtras(gameData);
Run Code Online (Sandbox Code Playgroud)

//从包中获取数据包的容器活动.

Bundle gameData = getIntent().getExtras();
        if (gameData != null)
        {
            int over = gameData.getInt(Constant.KEY_REQUESTED_OVER);
            ArrayList<String> players = gameData.getStringArrayList(Constant.KEY_PLAYERS_ARR);
            String team = gameData.getString(Constant.KEY_TEAM_NAME);

        }
        else if (gameData == null)
        {
            Toast.makeText(this, "Bundle is null", Toast.LENGTH_SHORT).show();
        }
Run Code Online (Sandbox Code Playgroud)


Has*_*req 6

接口是最好的解决方案之一:

胶水接口:

public interface DataProviderFromActivity {

    public String getName();
    public String getId);

}  
Run Code Online (Sandbox Code Playgroud)

我的活动:

public class MyActivity implements DataProviderFromActivity{

    String name = "Makarov";
    String id = "sys533";

    ... ... ... ... ... .... .... 
    ... ... ... ... ... .... .... 

    public String getName(){
        return name;
    };
    public String getId(){
        return id;
    };
}
Run Code Online (Sandbox Code Playgroud)

我的片段:

public class MyFragment extends Fragment{

    String fragName = "";
    String fragId = "";

    ... ... ... ... ... .... .... 
    ... ... ... ... ... .... .... 

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

        DataProviderFromActivity myActivity= (DataProviderFromActivity) getActivity();
        fragName = myActivity.getName();
        fragId = myActivity.getId();

        ... ... ... ... ... .... .... 
        ... ... ... ... ... .... .... 

        updateFragmentView();
    }
}
Run Code Online (Sandbox Code Playgroud)