0

다른 작업의 의도와 함께 다른 인스턴스를 저장하는 두 개의 사용자 지정 개체를 보내려고합니다.Intent.getSerializableExtra가 null을 반환합니다.

public class Story implements Serializable { 

    private String title, author; 
    private ArrayList<StorySegment> segments; 

... } 


class StorySegment implements Serializable { 

    private String author; 
    private String contents; 

... } 

을 그리고 내 StoryOverviewAdapter 클래스에서, 나는이있어 :이 두과 같이, 직렬화 구현

public class StoryOverviewAdapter extends ArrayAdapter<Story> { 

    public StoryOverviewAdapter(Context ctx, ArrayList<Story> stories) { 
     super(ctx, 0, stories); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      convertView = LayoutInflater.from(getContext()).inflate(
        R.layout.story_overview_item, parent, false); 
     } 

     final Story story = getItem(position); 

     TextView tvStoryTitle = (TextView) convertView.findViewById(R.id.tv_story_title); 
     tvStoryTitle.setText(story.getTitle()); 
     TextView tvStoryOpening = (TextView) convertView.findViewById(R.id.tv_story_opening); 
     tvStoryOpening.setText(story.getSegment(0).getContents()); 

     ImageView ivUserPicture = (ImageView) convertView.findViewById(R.id.iv_user_picture); 
     ivUserPicture.setTag(position); 
     ivUserPicture.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // Show user profile 
      } 
     }); 

     LinearLayout llStoryLayout = (LinearLayout) convertView.findViewById(R.id.story_layout); 
     llStoryLayout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(v.getContext(), StoryActivity.class); 
        intent.putExtra("story", story); 
       getContext().startActivity(intent); 
      } 
     }); 

     return convertView; 
    } 
} 

내가 수신 활동에서 내 의도에서이 정보를 끌어 갈 때. ..

Intent intent = getIntent(); 
Story story = (Story) intent.getSerializableExtra("story"); 

... 그리고 내 코드를 테스트하려고,이 얻을 :

java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.Serializable android.content.Intent.getSerializableExtra(java.lang.String)' on a null object reference 

그리고 이유를 모르겠습니다. 아마도 스토리 변수에서 'final'을 제거하면 제거 될 수 있다고 생각했지만, 내부 변수를 사용하지 않고 내부 OnClickListener 클래스에서 변수에 액세스 할 수 없습니다. 무엇을해야할지 모르겠습니다.

편집 : 또한, 여기

public class OverviewActivity extends AppCompatActivity { 

    ArrayList<Story> stories = new ArrayList<Story>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_overview); 

     stories.add(new Story("Lorem Ipsum", "Firstname Lastname", 
       new StorySegment("Firstname Lastname", "Lorem ipsum dolor sit amet, lorem ipsum dolor sit amet, lorem ipsum dolor sit amet..."))); 

     StoryOverviewAdapter storyOverviewAdapter = new StoryOverviewAdapter(this, stories); 
     ListView listView = (ListView) findViewById(R.id.story_overview_list); 
     listView.setAdapter(storyOverviewAdapter); 
    } 
} 
+0

체크 아웃이 너무 http://stackoverflow.com/questions/37646466/attempt-to-invoke-virtual-method-on -a-null-object-reference-for-video-id –

+0

이야기가 null이 아니 었습니까? –

+0

우선, Serializable 객체가 null이 아니고 intent에 전달한 후 확인하십시오. – Shailesh

답변

0

변경이

Intent intent = new Intent(v.getContext(), StoryActivity.class); 
        intent.putExtra("story", (Serializable)stories.get(position)); 
       getContext().startActivity(intent); 
+0

오류 메시지에는 영향을주지 않습니다. 아직도 나에게 똑같은 것을 준다. – Varoun

+0

@Varoun 나는 내 대답을 편집했다.그것이 당신을 위해 일하기를 바란다 –

0

사용이에이

Intent intent = new Intent(v.getContext(), StoryActivity.class); 
        intent.putExtra("story", story); 
       getContext().startActivity(intent); 

... 내가 이야기를 추가 한 것을 보여준다 코드입니다 코드가 제대로 작동합니다.

+0

작동하지 않는 것 같습니다. 이전과 같은 오류가 발생합니다. – Varoun

1

0 내가 대신 외부의 내에서 onCreate() 메소드로 ... 의도의 엑스트라를 얻을 수있는 시도를 마이그레이션하여

Intent intent = getIntent(); 
    story = (Story) intent.getSerializableExtra("story"); 

을이 문제를 해결 할 수 있었다. 그래서 그 대신이의 ...

Intent intent = getIntent(); 
Story story = (Story) intent.getSerializableExtra("story"); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_story); 

... 지금

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_story); 

    Intent intent = getIntent(); 
    Story story = (Story) intent.getSerializableExtra("story"); 
} 

은 대만족 ... 내 부분에 바보 같은 감독이었다 ...이있다!

0

GSON을 사용하여 사용자 지정 개체를 일반 텍스트로 보낼 수도 있습니다. 직렬화가 필요하지 않습니다.

String intentData = gson.toJson(storyObject); 
    intent.putExtra("story", intentData); 

그리고 당신은 같이 쓸 수있는 수신 활동

,

Story object = gson.fromJson(intentData, Story.class); 
+0

감사합니다. 아직도 이것에 대해 거의 알지 못했고 직렬화가 차선책 일 수 있다고 들었습니다. 그래서 이것을 확실히 확인해 보겠습니다. – Varoun

관련 문제