2013-09-05 2 views
0

downvoting하고이 질문에 대한 투표가 textview의 범위와 관련이 있다고 생각하여 투표를 마쳤다면 ..... 텍스트보기의 범위와 아무 관련이 없습니다.조각간에 데이터를 전달하는 방법은 무엇입니까?

(이 조각이 통과

, 응용 프로그램 충돌, 난 내가 잘못하고있는 무슨 모르는 조각 사이에 데이터를 전달할 수 없습니다 ... 나는이 링크를 여기 http://manishkpr.webheavens.com/android-passing-data-between-fragments/

내가 프래그먼트를 사용하고있는 코드가 따라 데이터)

public class FragmentSongs extends Fragment implements Serializable,OnFragmentCreatedListener { 
ListView SngList; 


ArrayList<SongDetails> Songinfo=null; 
AdapterView.AdapterContextMenuInfo info; 

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

    ViewGroup view = (ViewGroup) inflater.inflate(R.layout.fragment_song, null); 

    SngList = (ListView) view.findViewById(R.id.SongList); 
    registerForContextMenu(SngList); 
    //File f=new File(Environment.getExternalStorageDirectory()+"/Music"); 
    File f=new File("/system/"); 
    int j=0;int i=0; 

    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

     Songinfo = getSongsFromDirectory(f); 



    //sorting done below 
    if (Songinfo.size()>0) 
    { 

     for(j=0; j<Songinfo.size();j++) 
     { 
      for (i=j+1 ; i<Songinfo.size(); i++) 
      { 
       SongDetails a=Songinfo.get(i); 
       SongDetails b=Songinfo.get(j); 
       if(a.getSong().toLowerCase().compareTo(b.getSong().toLowerCase())<0) 
       { 

        Songinfo.set(i,b); 
        Songinfo.set(j,a); 
       } 
      } 

     } 






    SngList.setAdapter(new CustomAdapter(Songinfo)); 
    return view; 
    } 
    else return null; 

} 
OnFragmentCreatedListener listener; 
@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     listener = (OnFragmentCreatedListener) getActivity(); 
     listener.onFragmentCreated(Songinfo); 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() + " must implement onFragmentCreated"); 
    } 
} 

frag 멘트 B (수신기 단편)

public class FragmentArtists extends Fragment { 
    ArrayList<SongDetails> songinfo2; 
ViewGroup view; 
int s=5;//TextView text; 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) 
{Context context; 
LayoutInflater lf = getActivity().getLayoutInflater(); 

    view = (ViewGroup) inflater.inflate(R.layout.fragment_artist, null); 
// view = lf.inflate(R.layout.test,container, false); 
// view = inflater.inflate(R.layout.test,container, false); 


s=s+5; 
//  text=(TextView)view.findViewById(R.id.tt);when i use this,it works fine but i want to do it in the other method 

//text.setText("makzzz");when i use this,it works fine but i want to do it in the other method 
return view; 

} 

void setSongList(ArrayList<SongDetails> songinfo) 
{ //TextView text=(TextView)this.getView().findViewById(R.id.tt);//when i used this view was not global 
     TextView text=(TextView)view.findViewById(R.id.tt);//when i used this,view was global; 
     //TextView text=(TextView)view.findViewById(R.id.tt); 
    // text=(TextView)super.getView().findViewById(R.id.tt); 


    text.setText("makzzz"); 

홀더 활성 방법 (이 활성 단편 보유)

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mymusic); 


      fragments = new Vector<Fragment>(); 
      fragments.add(Fragment.instantiate(this, FragmentSongs.class.getName())); 
      fragments.add(Fragment.instantiate(this, FragmentArtists.class.getName())); 
      fragments.add(Fragment.instantiate(this, FragmentPlaylists.class.getName())); 
      fragments.add(Fragment.instantiate(this, FragmentAlbums.class.getName())); 


      ViewPagerAdapter adapter = new ViewPagerAdapter(super.getSupportFragmentManager(), fragments); 


      ViewPager pager = (ViewPager)super.findViewById(R.id.viewpager); 



      pager.setAdapter(adapter); 
      pager.setOffscreenPageLimit(4); 

      pager.setCurrentItem(0); 

    }  public void onFragmentCreated(ArrayList<SongDetails> msg) { 
      FragmentArtists Obj=(FragmentArtists) fragments.get(1); 
      Obj.setSongList(msg); 
      } 

    } 

콜백 클래스 여기

package sourcecode.jazzplayer; 

import java.util.ArrayList; 

public interface OnFragmentCreatedListener { 
    public void onFragmentCreated(ArrayList<SongDetails> msg); 

} 

는 로그 캣

09-19 23:50:46.851: E/AndroidRuntime(2125): java.lang.NullPointerException 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at sourcecode.jazzplayer.FragmentArtists.setSongList(FragmentArtists.java:55) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at sourcecode.jazzplayer.MyMusic.onFragmentCreated(MyMusic.java:45) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at sourcecode.jazzplayer.FragmentSongs.onAttach(FragmentSongs.java:128) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:883) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(FragmentManager.java:823) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.support.v4.app.Fragment.setUserVisibleHint(Fragment.java:819) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.support.v4.app.FragmentPagerAdapter.setPrimaryItem(FragmentPagerAdapter.java:130) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.support.v4.view.ViewPager.populate(ViewPager.java:1066) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.support.v4.view.ViewPager.populate(ViewPager.java:914) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.view.View.measure(View.java:12603) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.view.View.measure(View.java:12603) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:660) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:553) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.view.View.measure(View.java:12603) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2072) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.view.View.measure(View.java:12603) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1044) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2418) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.os.Handler.dispatchMessage(Handler.java:99) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.os.Looper.loop(Looper.java:137) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.app.ActivityThread.main(ActivityThread.java:4340) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at java.lang.reflect.Method.invoke(Method.java:511) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at dalvik.system.NativeStart.main(Native Method) 

이 코드 줄에 오류가 있습니다.

TextView text = (TextView) view.findViewById (R.id.tt); //이 줄 수신기 조각입니다 (fragmentArtist는)

+0

충돌이 무엇인지 알면 도움이 될 수 있습니다. 당신은 logcat을 게시 할 수 있습니까? – andy256

+0

게시 logcat ...하지만 난 다른 방법을 사용하여 조각 사이의 데이터를 전달해야한다고 생각 (예 : widh 인수) – Pauland

+0

@ Pauland 내게 데이터를 전달하는 다른 방법의 링크를주세요 –

답변

2

내가 이미 언급 한 바에 의하면 제대로 초기화되지 않은 경우 Fragment으로 작업하려고합니다. FragmentSongsActivity에 부착되면 (ViewPager에 의해 요청 된 동작) onAttach() 메서드가 호출됩니다. 이 방법에서는 Activity을 수신기 ()로 전송하지만 청취자의 콜백 ()도 즉시 호출합니다. 청취자가 두 번째 Fragment (ViewPager, FragmentArtists)의보기로 작업하려고하기 때문에 앱을 다운시킨 경우 (예외는 게시 한 것입니다). 이 Fragment은 아직 초기화되지 않았습니다.이 순간에 ViewPager의 첫 번째 조각이 거의 액티비티에 연결되어 있지 않으며 두 번째 조각의보기를 사용하여 이미 실패한 것입니다.

당신이 링크 한 튜토리얼은 단순하지만 괜찮습니다. (링크를 보지 않고 튜토리얼에서 코드를 얻었습니다.) 문제는 좀 더 복잡한 상황에서 매우 단순한 시나리오의 코드를 사용했다는 것입니다. 실제로는 튜토리얼 코드에 현재 코드를 삽입하면 동일한 예외 (리스너를 너무 일찍 호출)가 발생합니다.

사용자가 앱을 사용하고 노래를 선택하고 앱의 아티스트 부분을 표시하려고 할 때 (그 순간에 청취자에게 전화를 걸 때와 같이) 콜백 수신기 인터페이스가 사용되어야합니다 또한 데이터를 전달)) 또한 조각을 사용할 수 없게 될 가능성을 신중하게 처리합니다.

조각의 수명주기 초기에 조각간에 데이터를 전달해야하는 경우 (조각의 onAttach()에서 수신기를 호출하는 것처럼) 조각을 아직 사용할 수 없다고 보장 할 수 없으면 조각을 구현하여 데이터 이며, 라이프 사이클 메소드 중 하나에서 생성됩니다. 당신이 지나가고있는 것이 분명하지 않아 여기에서 말할 수있는 것이별로 없습니다.

+0

질문이 있습니다 ...... pager.setOffscreenPageLimit (4); (이 코드는 내 조각을 정의한 홀더 활동에 있습니다) 이 않습니다 코드의 라인은 내 조각이 동시에 모든 빌드됩니다 보장 ... ??? –

+0

그리고 그렇지 않은 경우 뷰 페이지를 사용하여 둘 이상의 조각을 동시에 만들 수 있습니까? 그리고 일단 만들어지면 표시 만 할 수 있습니까? –

+0

그리고 내가 따라온 튜토리얼은 개발자 웹 사이트에서도 제공됩니다. –

0

귀하의 FragmentSongs 클래스는 OnFragmentCreatedListener

public class FragmentSongs extends Fragment implements OnFragmentCreatedListener { 

    public void onFragmentCreated(ArrayList<SongDetails> msg) { 
    // whatever 
    } 


} 

또는 '조각 A'의 onAttach에서 구현해야합니다 :

 listener = (OnFragmentCreatedListener) activity; 

이것은 ActivityOnFragmentCreatedListener

을 구현해야 함을 의미합니다.
+0

그러면 다른 (NullPointException) 오류가 발생합니다 ........ ... 조각 B에서 ... (다른 조각에서 정보를받은 후 뭔가를 설정하기위한 것입니다.)이 줄에 오류가 있습니다. text.setText ("makzzz"); –

+0

그래, 네 질문에 대답했다. 이제 귀하의 견해 중 하나가 null입니다 (다른 별도의 질문). – Blundell

+1

글쎄, 나는 그 문제를 해결하면 (이 문제와 관련하여 다른 문제로 이어질 수 있음) –

관련 문제