【问题标题】:how to pass string data from activity to fragment?如何将字符串数据从活动传递到片段?
【发布时间】:2014-08-13 13:51:22
【问题描述】:

我想将字符串值从活动传递到片段。为此,我使用 bundle 来传输字符串值。

放置字符串活动 传递字符串值:-

           Bundle bundle = new Bundle();
            bundle.putString("Value", resultp.get(CurrentProjectActivity.VALUE));
            Log.d(TAG, "Value  ::: " + resultp.get(CurrentProjectActivity.VALUE));
            // set Fragmentclass Arguments
            AmenetiesFragment fragobj = new AmenetiesFragment();
            fragobj.setArguments(bundle);

在日志中我也得到了“价值”值。

在片段中获取字符串值(它不起作用)。

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

    View rootView = inflater.inflate(R.layout.activity_listview, container, false);
    Bundle bundle = this.getArguments();
    Log.d(TAG, "Value's value:)  ::: " + bundle);
    String strtext = bundle.getString("Value");
    return rootView;
}

在日志中,我得到 BUNDLE 的 NULL 值。请帮我解决这个问题。提前致谢。

【问题讨论】:

  • 你在哪里创建和设置片段的参数?
  • "Value" 是我使用 JSON 解析技术从 JSON 中挑选出来的 Sting。从中我也可以获得价值。在日志中我可以查看。
  • @Amar 可能 resultp.get(CurrentProjectActivity.VALUE) 不是字符串类型。请以另一种方式检查我的答案。

标签: android android-fragments fragment


【解决方案1】:

我建议您关注 link1this 。你应该使用界面。检查here

Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
// set Fragmentclass Arguments
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);

在 Frament 任务中

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    String strtext = getArguments().getString("edttext");    
    return inflater.inflate(R.layout.fragment, container, false);
}

【讨论】:

  • 这些链接真的很好。几天前我使用了第一个链接。
  • @Paritosh 那么问题出在哪里。这就是我们使用它的标准方式
  • 是的。我正在使用滑动菜单作为界面。
  • @Amar 现在有效了吗。请仔细检查值
  • @james。它不工作。对于滑动菜单,我正在实现这个概念。所以我也在 SlidingActivity 中创建了片段。这也许是原因。我会检查并更新。谢谢:)
【解决方案2】:

假设你想将String数据从Activity发送到Fragment

在 Fragment.java 文件中添加以下代码,

public static String name= null;

public void setName(String string){
name = string;
}

在要发送字符串的 MainActivity.java 中添加以下代码,

String stringYouWantToSend;

Fragment fragment =  new Fragment();
fragment.setName(stringYouWantToSend);   

【讨论】:

    【解决方案3】:

    第一次运行应用程序时,savedInstance 变量将为空, 它仅在调用 onSaveInstanceState 方法时才会被填充,这通常发生在您旋转屏幕时,然后将填充 savedInstance 变量。试试这个:

    if(savedInstance != null){
      Log.d(TAG, "There's is something");
    }else{
      Log.d(TAG, "Nothing in there");
    }
    

    第一次在 logcat 中你会看到第一条消息,试着转动你的设备,else 中的消息就会显示出来。

    正如@james 所说,推荐的方法是使用接口,或者有一个字段类,但这会增加耦合并破坏片段的整个点。

    【讨论】:

      【解决方案4】:

      首先在活动中公开您在片段中需要的对象。 那么你可以使用((ACtivityName)getActivity()).objectName; 我希望它有所帮助。这不是将数据传递到片段的最佳方式。

      还有其他方法。 创建片段类的构造函数并将其传递并保存在片段中,例如:

          public MyFragment(String data){
             this.data = data;
          }
      

      您也可以将@james 的答案用作捆绑包。

      编辑:-

      第一道

      private class MyFeagment extends Fragment {
          private String data;
          private Object myObject;
      
          public MyFeagment(String data, Object anyObject) {
              this.data = data;
              this.myObject = myObject;
          }
      
          @Override
          public View onCreateView(LayoutInflater inflater, ViewGroup container,
                  Bundle savedInstanceState) {
              Log.i("My Fragment", "data :: " + data + " and myObject :"
                      + myObject);
              return super.onCreateView(inflater, container, savedInstanceState);
          }
      }
      

      假设它是您的框架网。 并将此代码放入您的活动中

      FragmentManager manager = getSupportFragmentManager();
          FragmentTransaction transaction = manager.beginTransaction();
          transaction.add(R.id.fragment_container, new MyFeagment("My Data",
                  "data"));
          transaction.commit();
      

      【讨论】:

      • 我没听明白。我认为您正在尝试以与我们在 onAttach 中使用的方式相同的方式获取数据
      • 谢谢伙计。完美的。克利里明白你想说什么。谢谢
      【解决方案5】:

      最简单的方法,但不推荐

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

      活动:

      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;
          }
      }
      

      片段:

      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;
          }
      }
      

      【讨论】:

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