【问题标题】:send intent from main activity to two fragment将意图从主要活动发送到两个片段
【发布时间】:2017-02-03 12:40:10
【问题描述】:

我有 2 个Fragment,我必须向Fragment 发送一些 ID。我用这个:

public void onItemLongClick(View view, int position) {
    FragmentManager fm = getSupportFragmentManager();
    actionOption actionOption = new actionOption();
    actionOption.show(fm,"fragment_edit_name");
    ToDoModule movie = dbList.get(position);
    int y= movie.getId();
    Bundle args = new Bundle();
    args.putInt("exampleInt", y);
    actionOption.setArguments(args);

    EditOption editOption = new EditOption();

    ToDoModule bl = dbList.get(position);
    int z= movie.getId();
    Bundle zs = new Bundle();
    zs.putInt("int", y);
    editOption.setArguments(zs);
}

第一个Fragment 正在工作,但第二个没有发送。无法向EditOption 发送值?

如何解决?

【问题讨论】:

  • 您不能使用意图将数据同时发送到两个片段。数据将仅发送到当时被调用的片段(在您的情况下为 ToDoModule)。如果你想在多个分片中访问相同的数据,可以将其保存在SharedPreferences,并在需要时从分片中访问。
  • 但是数据会改变吗?我可以用 SharedPreferences 做到这一点吗?
  • 如果你将数据保存在SharedPreferences,除非你更新它,否则它不会改变。
  • 嗯,我需要另一个解决方案,谢谢
  • 检查这个答案stackoverflow.com/a/39489617/2826147。希望对您有所帮助。

标签: android android-fragments


【解决方案1】:

非常不寻常的是,您试图同时将一些数据传递给两个Fragment。如果你能在你的问题中简短地写下你的情况,那就太好了。

无论如何,@Prera​​kSola 提出了一个解决方案,用于保存您想要在 SharedPreference 中传递的数据,我认为它应该适用于您的情况。

您正在尝试将电影 ID 传递给 actionOption 以及 editOption。您可能会尝试先将 id 存储在 SharedPreference 中,如下所示。

来自您的Activity

public void onItemLongClick(View view, int position) {

    // ... Your code 

    // Save the movie id
    SharedPreferences pref = getSharedPreferences("MY_APPLICATION", MODE_PRIVATE);
    pref.edit().putInt("MOVIE_ID", movie.getId()).commit();

    // Do not pass any bundle to the Fragment. Just transact the Fragment here
}

现在从您的FragmentonCreateView 获取首选项中的值。

SharedPreferences pref = getActivity().getSharedPreferences("MY_APPLICATION", MODE_PRIVATE);
String movieID = pref.getInt("MOVIE_ID", 0);

另一种方法是,您可以尝试使用可能包含电影 ID 的 public static int 变量,并且您可以从代码中的任何位置访问它。

希望对您有所帮助!

【讨论】:

  • 谢谢,但收到 id id = pref.getInt("id",0);只需要0,我怎么能改变0?
  • 在设置首选项中的值后检查您是否已提交。那么你应该得到正确的id。 pref.edit().putString("MOVIE_ID", movie.getId()).commit();
  • 哦,谢谢你的回答有效,我在更新数据库时出错,我解决了非常感谢你我会接受你的回答请投票给问题^_^
【解决方案2】:

这样的事情,你可以做到的

public interface SetData {
    public void data(String id);
}

From your activity class or on item click listner
 SetData setData;  
 setData.setDrawerEnabled("anydata");

Infragment , YourFragment extends Fragment implements SetData

【讨论】:

    【解决方案3】:

    你好昨天我做了同样的事情,它是如何工作的,我会给你想法。

    它已经回答了,但我只想分享我的经验。这种方式很完美。

    首先在你的activity中创建两个接口,

    public interface TaskListener1 {
        public void onResultAvailable(String result);
    }
    
    public interface TaskListener2 {
        public void onResultAvailable(String result);
    }
    

    现在来到你的活动,然后像这样调用你想将数据发送到片段的地方。我只是给你一个例子。你可以随心所欲。

        class TestAsyncTask extends AsyncTask<Void, String, Void> {
    
        String response_result;
        public TaskListener1 taskListener1 = null;
        public TaskListener2 taskListener2 = null;
    
        public TestAsyncTask(TaskListener1 taskListener1, TaskListener2 taskListener2) {
            this.taskListener1 = taskListener1;
            this.taskListener2 = taskListener2;
    
        }
        @Override
        protected Void doInBackground(Void... unused) {
    
            response_result = "Test data what you want to send"; 
    
            return null;
        }
    
        @Override
        protected void onPostExecute(Void unused) {
    
                taskListener1.onResultAvailable(response_result);
                taskListener2.onResultAvailable(response_result);
    
        }
    }
    

    这样打电话,

     new TestAsyncTask(new Fragment1), new Fragment2)).execute();
    

    以及如何获取fragment中的数据,

    第一个片段,

     public class Fragment1 extends Fragment implements YourActivity.TaskListener1 {
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        view = inflater.inflate(R.layout.fragment1, container, false);
        return view;
    
    }
    
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    
    
    }
    
    
    @Override
    public void onResultAvailable(String result) {
    
        Logs.d("TAG", "Fragment result1:" + result);
    }
    }
    

    第二个片段,

    public class Fragment2 extends Fragment implements YourActivity.TaskListener2 {
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        view = inflater.inflate(R.layout.fragment2, container, false);
        return view;
    
    }
    
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    
    }
    
    
    @Override
    public void onResultAvailable(String result) {
    
        Logs.d("TAG", "Fragment result2:" + result);
    }
    }
    

    谢谢希望这对某人有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多