如何将对象从片段传递到活动 - Android

时间:2017-12-11 05:00:41

标签: java android

编辑:我尝试将数据从片段传递到容器活动。我试图将数据从片段传递到 DIFFERENT 活动。 ALSO ,我的帖子并不是关于我得到的错误;我只是把它放在那里供参考。我对这篇文章的唯一问题是," 有人可以告诉我,我是否正确实现了界面?"

我无法将对象从主要活动中的片段传递到其他活动。我使用接口尝试在片段和活动之间传递对象。

我的应用是一款通过Google地图及其标记显示校园活动的应用。 Google Map在片段内实现。

当用户点击标记时,应该将一个事件对象传递给一个活动,弹出一个屏幕,显示传递的事件对象的详细信息。

以下是NowMapFragment类中的界面(带有Google Map的片段)和有人按下标记时的onMarkerClick事件

private GoogleMap mMap;
private OnFragmentInteractionListener mListener;
ArrayList<Event> events = Event.getEvents();

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    try {
        mListener = (OnFragmentInteractionListener) activity;
    }
    catch (Exception e) {

    }
}

@Override
public boolean onMarkerClick(Marker marker) {
    Intent intent = new Intent();

    for(Event event : events) {
        if(marker.getTitle().equals(event.getName())) {
            mListener.setEvent(event);
        }
    }

    intent = new Intent(getActivity(), EventDetails.class);
    startActivity(intent);

    return true;
}

public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    void onFragmentInteraction(Uri uri);
    void setEvent(Event event);
}

这是我尝试将事件对象传递给

的活动
package com.group4.group4;

import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class EventDetails extends AppCompatActivity implements NowMapFragment.OnFragmentInteractionListener {

    Event event;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_details);
        /*FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(R.id.map, new NowMapFragment()).commit();*/
        setTitle(event.getName());

        TextView eventDescription = (TextView) findViewById(R.id.event_description);
        TextView eventLocation = (TextView) findViewById(R.id.event_location);
        TextView eventDate = (TextView) findViewById(R.id.event_date);
        TextView eventTime = (TextView) findViewById(R.id.event_time);
        final TextView eventAttendance = (TextView) findViewById(R.id.event_attendance);
        Button checkIn = (Button) findViewById(R.id.check_in);

        eventDescription.setText(event.getDescription());
        eventLocation.setText("Location: " + event.getLocation());
        eventDate.setText("Date: Tuesday, December 5, 2017");
        eventTime.setText("Time: 9:30 AM to 12:15 PM");
        eventAttendance.setText("Current Attendance: " + Integer.toString(event.getAttendance()));
        checkIn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int counter = event.getAttendance();
                event.setAttendance(++counter);
                eventAttendance.setText("Current Attendance: " + Integer.toString(event.getAttendance()));
                Toast toast = Toast.makeText(getApplicationContext(), "Successful check in.", Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.TOP|Gravity.CENTER, 0, 0);
                toast.show();
            }
        });
    }

    @Override
    public void onFragmentInteraction(Uri uri) {

    }

    @Override
    public void setEvent(Event event) {
        this.event = event;
    }
}

我觉得我只是误解了如何实现界面,并且错误地实现了它。

另外,我的确切错误是:

  

java.lang.NullPointerException:尝试调用虚方法   &#39; java.lang.String com.group4.group4.Event.getName()&#39;在null对象上   参考

有人能告诉我我是否正确实施了界面?

3 个答案:

答案 0 :(得分:0)

  

片段附加到同一Activity你可以尝试这个,

((YourActivity)getActivity()).getYourObjects();

答案 1 :(得分:0)

您可以使用setArgumentsgetArguments,如下所示

Fragment中使用setArguments

Bundle bundle = new Bundle();
bundle.putString("event", event);
intent = new Intent(getActivity(), EventDetails.class);
intent.setArguments(bundle)
startActivity(intent);

Activity

使用getArguments

Event event = getArguments().get("event");

答案 2 :(得分:0)

发生错误,因为您在event.getName() - 活动方法中调用onCreate()

您应该查看活动的生命周期。 您的全局属性event未在onCreate()

上初始化

您应该使用

传递您的活动
intent = new Intent(getActivity(), EventDetails.class);
intent.putExtra("event", event);
startActivity(intent);

并在您onCreate()

的活动中致电
Event event = (Event) getIntent().getSerializableExtra("event");

注意:您的班级Event应该实现Serializable界面来执行此操作