【问题标题】:Android: pass a JSONobject between FragmentsAndroid:在片段之间传递 JSON 对象
【发布时间】:2013-12-05 14:34:17
【问题描述】:

我正在开发一个小天气应用程序,它使用 ListFragment 来显示每天的天气,并使用包含更多信息的详细片段。我试图让每个细节片段显示每个列表视图日的相应天气。下面是一些sn-ps的代码:

ListFragment 的部分内容:

    public class WeatherListFragment extends ListFragment implements LocationListener{

        private final String initialURL = "https://api.forecast.io/forecast/8fc2b0556e166fa4670d4014d318152a/";
        Weather[] myWeatherArray = {};
        WeatherAdapter weatherAdapter;
        LocationManager mLocationManager;
        String currentLoc;
        JSONObject day;

        OnWeatherSelectedListener mCallback;

        // The container Activity must implement this interface so the frag can deliver messages
        public interface OnWeatherSelectedListener {
            /** Called by HeadlinesFragment when a list item is selected */
            public void onWeatherSelected(int position, String data);
        }



@Override
    public void onListItemClick(ListView l, View v, int position, long id) {

        //call back to the parent activity with the selected item

        mCallback.onWeatherSelected(position, data);
        l.setItemChecked(position, true);


    }


 try {
                    JSONObject daily = response.getJSONObject("daily");
                    JSONArray data = daily.getJSONArray("data");
                    myWeatherArray = new Weather[data.length()];
                    for (int i = 0; i < myWeatherArray.length; i++) {
                        day = data.getJSONObject(i);
                        Weather myWeatherObject = new Weather();
                        myWeatherObject.setmDate(day.getInt("time"));
                        myWeatherObject.setmTempMin(day.getInt("temperatureMin"));
                        myWeatherObject.setmTempMax(day.getInt("temperatureMax"));
                        myWeatherObject.setIcon(day.getString("icon"));
                        myWeatherArray[i] = myWeatherObject;

                    }

                } catch (JSONException e) {
                    e.printStackTrace();

}

主要活动:

public class MainActivity extends ActionBarActivity implements WeatherListFragment.OnWeatherSelectedListener {

 @Override
    public void onWeatherSelected(int position, String data) {
        // The user selected the headline of an article from the HeadlinesFragment


        WeatherDetailFragment weatherDetailFragment = (WeatherDetailFragment)getSupportFragmentManager().findFragmentById(R.id.weather_detail_fragment);

        //One pane layout
        if(weatherDetailFragment == null) {
            WeatherDetailFragment onePaneFragment = new WeatherDetailFragment();

            Bundle args = new Bundle();
            args.putInt(WeatherDetailFragment.ARG_POSITION, position);

            onePaneFragment.setArguments(args);

            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.container, onePaneFragment)
                    .addToBackStack(null)
                    .commit();

细节片段:

public class WeatherDetailFragment extends Fragment {



    final static String ARG_POSITION = "position";

    int mCurrentPosition = -1;
.
.
.
public void updateWeatherView(int position, String data) {

        View v = getView();
        TextView day = (TextView) v.findViewById(R.id.dayTextView);
        TextView date = (TextView) v.findViewById(R.id.dateTextView);
        TextView tempMin = (TextView) v.findViewById(R.id.tempMinTextView);
        TextView tempMinF = (TextView) v.findViewById(R.id.tempMinFTextView);
        TextView tempMax = (TextView) v.findViewById(R.id.tempMaxTextView);
        TextView tempMaxF = (TextView) v.findViewById(R.id.tempMaxFTextView);
        ImageView imageView = (ImageView) v.findViewById(R.id.imageView);
        ImageView imageView2 = (ImageView) v.findViewById(R.id.imageView2);


        mCurrentPosition = position;
    }
.
.
}

【问题讨论】:

  • 使用接口作为回调。所有 Fragment 到 Fragment 的通信都是通过关联的 Activity 完成的。两个 Fragment 永远不应该直接通信。 developer.android.com/training/basics/fragments/…
  • 对不起,我知道了。我正在使用回调将 listview 位置从 listfragment 传递给 Activity,然后返回到详细片段。我不确定如何将每天的 JSONobject 转换为 String 并将其传回。
  • 如何绑定到HashMap对象类并发送到其他片段!

标签: android json android-fragments


【解决方案1】:

如果您使用Bundle 对象,传递JSONObject 会更容易。通过 JSONObject.toString() 方法将JSONObject 转换为String。然后将其设置为Bundle 对象。例如:

   Bundle args=new Bundle();
   String userProfileString=userProfileJsonObject.toString();
   args.putString("userProfileString", userProfileString);
   fragmentUserProfile.setArguments(args);

然后在目标片段中,在 onCreateView 方法中,您可以提取字符串并将其重新转换为 JSONObject。

String userProfileString=getArguments().getString("userProfileString");
JSONObject jsonObject=new JSONObject(userProfileString);

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 2013-06-21
    • 1970-01-01
    • 2019-08-17
    相关资源
    最近更新 更多