【问题标题】:Sending data to the container activity向容器活动发送数据
【发布时间】:2017-05-05 10:24:59
【问题描述】:

我遇到了在片段及其容器活动之间来回发送一些数据的问题,我成功地做到了。让我感到困惑的是,我将数据从片段发送到活动,起初我实现了OnResume()OnStop() 并通过意图发送数据,这创建了一个无限循环,所以我删除了它们。然后我做了setRetainInstance(true),它起作用了,给了我想要的行为。

我的问题是我的数据是如何真正被发送的以及在片段生命周期中的什么位置?

【问题讨论】:

标签: android android-fragments


【解决方案1】:

正确的方法是使用接口。不要使用 onStop 或 setRetainInstance()

看到这个。它会解决你的问题。 Pass data from fragment to actvity

【讨论】:

    【解决方案2】:

    您还可以通过使用Interface、使用LocalBroadcastManager 之类的EventBus 或使用Intent 开始一个新的Activity 以及将某种形式的flag 传递到其extras Bundle 来实现此目的或者别的什么。

    这是一个使用接口的例子:

    1.在界面中添加函数sendDataToActivity()EventListener)。

    //EventListener.java
    
    public interface EventListener {
    
        public void sendDataToActivity(String data);
    }
    

    2. 在您的MainActivity 中实现此功能。

    // MainActivity.java
    
    public class MainActivity extends AppCompatActivity implements EventListener {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        @Override
        public void sendDataToActivity(String data) {
            Log.i("MainActivity", "sendDataToActivity: " + data);
        }
    }
    

    3.MyFragmentattach 中创建监听器到Activity

    4.最后,使用listener.sendDataToActivity("Hello World!")调用函数。

    // MyFragment.java 
    
    public class MyFragment extends Fragment {
    
        private EventListener listener;
    
        @Override
        public void onAttach(Activity activity)
        {
            super.onAttach(activity);
            if(activity instanceof EventListener) {
                listener = (EventListener)activity;
            } else {
                // Throw an error!
            }
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
            View view = inflater.inflate(R.layout.fragment_my, container, false);
    
            // Send data
            listener.sendDataToActivity("Hello World!");
    
            return view;
        }
    
        @Override
        public void onDetach() {
            super.onDetach();
    
            listener = null;
        }
    }
    

    希望对你有所帮助~

    【讨论】:

    • +1 表示努力和解释,我知道我可以使用界面来做到这一点,但我的问题是了解我现在是如何做到的? setRetainState(true) 是不是在为我做这件事,尽管我每次都在创建一个新的 myfragment 实例,还是什么?
    猜你喜欢
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多