2014-10-14 4 views
0

불편을 드려 죄송합니다. 난 당신이 매개 변수 조각에서 인수를 가져 오지 못했습니다.

public class FragmentPlaySong extends Fragment { 

.... 

private ArrayList<Song> songList; 
private int randomList = 0; 
private int currentSongPosition = 0; 

.... 


public static FragmentPlaySong newInstance(ArrayList<Song> songList, int randomList, int position){ 
    FragmentPlaySong fragmentPlaySong = new FragmentPlaySong(); 
    Bundle args = new Bundle(); 
    args.putSerializable("songs",songList); 
    args.putInt("randomList",randomList); 
    args.putInt("position",position); 
    fragmentPlaySong.setArguments(args); 
    return fragmentPlaySong; 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    final View view = inflater.inflate(R.layout.fragment_play_song, container, false); 

    ...... 

    return view; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    songList = (ArrayList<Song>) getArguments().getSerializable("songs"); 
    randomList = getArguments().getInt("randomList"); 
    currentSongPosition = getArguments().getInt("position"); 
} 

@Override 
public void onActivityCreated(Bundle state) { 
    super.onActivityCreated(state); 
    .... 

} 

내가

public class MainActivity extends Activity { 

private ListView lstSong;  
private ArrayList<Song> songs = new ArrayList<Song>(); 
private int randomList = 0;  

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

    .... 

    lstSong = (ListView) findViewById(R.id.lstsong); 

    lstSong.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 
      FragmentPlaySong fragmentPlaySong = new FragmentPlaySong(); 
      fragmentPlaySong.newInstance(songs,randomList,position);     
      getFragmentManager().beginTransaction().replace(R.id.FrgPlaySong, fragmentPlaySong).commit(); 
     } 
    });   
} 

.... 

}

내가있는 ListView에서 이벤트 클릭의 조각을 호출하는 곳에서 활동 클래스가를받을 인스턴스를 생성 한에 조각을 확장하는 클래스를 가지고

위의 설명 된 선, 특히 Fragment를 호출하기 위해 제시 한 문제로 인해 onCreate 이벤트를 호출 할 때 오류가 발생합니다. 조각

10-14 16:52:37.291 20744-20744/pe.com.mkella.simpleamp E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: pe.com.mkella.simpleamp, PID: 20744 
java.lang.RuntimeException: Unable to start activity ComponentInfo{pe.com.mkella.simpleamp/pe.com.mkella.simpleamp.MainActivity}: android.view.InflateException: Binary XML file line #31: Error inflating class fragment 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2212) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271) 
     at android.app.ActivityThread.access$800(ActivityThread.java:144) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5146) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566) 

Fragmen의 onCreate 메소드를 제거하면 오류가 발생하지 않지만 인수의 값을 가져올 수 없다는 것을 알았습니다.

귀하의 도움에 감사드립니다.

PD : 대신 활동의 FragmentActivity를 사용하는 나의 나쁜 영어

+0

당신이 게시 예외주의를 당신을 위해하는 XML 파일에 문제를 나타냅니다 라인 # 31. 액티비티/프래그먼트 레이아웃에 XML을 게시 할 수 있습니까? – emerssso

+0

emerssso 내 activity_main.xml http://pastebin.com/k2VNrEq6 –

답변

2

는 여기에 귀하의 문제입니다. 그래서 본질적으로이 줄에서 새로운 FragmentPlaySong 인스턴스를 할당하고 버리고 있습니다. 대신, 그 결과를 캡처하고 해당 인스턴스 사용 : 당신은 (사실, 나는 그는 조각에서 올바른 방법으로 생각하지 않습니다)에서 onCreate에 인수를 얻을 필요가 없습니다

FragmentPlaySong fragment = FragmentPlaySong.newInstance(songs, randomList, position); 
+0

변경 사항을 표시하면 나를 나타내지 만 여전히 동일한 오류가 발생합니다. –

-1

에 한번 죄송합니다.

도움이 되셨습니까?FragmentPlaySong 인스턴스를 반환

FragmentPlaySong fragmentPlaySong = new FragmentPlaySong(); 
fragmentPlaySong.newInstance(songs,randomList,position);     

귀하의 newInstance() 방법 :

0

합니다. 논리적 인 인수를 onCreateView()의 맨 위로 이동하고 onCreate()를 제거하십시오.

0

이 고민 한 후, 내가, 여기에 솔루션 너무 간단 것으로 판명이 오류를 피할 수 :

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Bundle bundle = getArguments(); 
    if (bundle != null) { 
     currentSongPosition = bundle.getInt("position", 0); 
     songList = (ArrayList<Song>) bundle.getSerializable("songs"); 
     randomList = bundle.getInt("randomList"); 
    } 
} 

감사

관련 문제