2016-09-22 1 views
-2

한 페이지에있는 뷰 페이지와 함께 수행해야하는 활동은 EditText 여야하고 다른 페이지는 TextView 여야합니다. 첫 번째 조각에서 데이터를 가져 와서 두 번째보기로 표시해야하지만ViewPager에서 조각상의 데이터를 다른 사람에게 전달할 수 없습니다.

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); 
     viewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager())); 
    } 

    private class MyPagerAdapter extends FragmentPagerAdapter { 

     public MyPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int pos) { 
      switch(pos) { 

       case 0: return EditFragment.newInstance("FirstFragment, Instance 1"); 
       case 1: { 
        Log.e("TAG", " is " + new EditFragment().getTag()); 
        return PreviewFragment.newInstance(new EditFragment().getTag()); 
       } 

       default: return EditFragment.newInstance("ThirdFragment, Default"); 
      } 
     } 

     @Override 
     public int getCount() { 
      return 2; 
     } 
    } 
} 

메인 레이아웃이

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/viewpager" 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 

EditFragment 같이 지식의 부족, 나는 주요 활동이다가

public class EditFragment extends Fragment { 

    public EditFragment(){} 

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

     EditText tv = (EditText) v.findViewById(R.id.content); 
     tv.setText(getArguments().getString("msg")); 

     return v; 
    } 

    public static EditFragment newInstance(String text) { 

     EditFragment f = new EditFragment(); 
     Bundle b = new Bundle(); 
     b.putString("msg", text); 

     f.setArguments(b); 

     return f; 
    } 
} 

PreviewFragment이

public class PreviewFragment extends Fragment { 

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

     TextView tvView = (TextView) v.findViewById(R.id.markdownView); 
     tvView.loadMarkdown(getArguments().getString("msg")); 

     return v; 
    } 

    public static PreviewFragment newInstance(String text) { 

     PreviewFragment f = new PreviewFragment(); 
     Bundle b = new Bundle(); 
     b.putString("msg", text); 

     f.setArguments(b); 

     return f; 
    } 
} 

내가 PreviewFragment에 EditFragment에서 데이터를 전달하는 방법을 모르겠어요, 도와주세요.

나는 파편에 새내기를 도와주세요.

UPDATE는

나는

public class PreviewFragment extends Fragment { 

    private TextView textView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_markdown, container, false); 
     textView = (TextView) v.findViewById(R.id.title);// initialized here 
     return v; 
    } 


    public void b_updateText(String t){ 
     Log.e("LOAD TXT", t);// Here I can get data Data is available 
     textView.setText(t); // but Here I get NPE, don't know why. 
    } 
} 

을 변경하지만, 여기에 이유를 모르겠어, NPE를 얻을.

및 EditFragment는

public class EditFragment extends Fragment { 

    public EditFragment(){} 
    private static Bundle bundle = null; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_editor, container, false); 

     final EditText tv = (EditText) v.findViewById(R.id.content); 

     final PsgerActivity mainActivity = (PsgerActivity) getActivity(); 
     mainActivity.message= tv.getText().toString(); 
     tv.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

      } 

      @Override 
      public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
       bundle = new Bundle(); 
       bundle.putString("md", tv.getText().toString()); 
       Log.e("BUNDLE", bundle.getString("md"));// Data is available 
      } 

      @Override 
      public void afterTextChanged(Editable editable) { 

      } 
     }); 

     return v; 
    } 

    public static EditFragment newInstance() { 
     EditFragment f = new EditFragment(); 
     f.setArguments(bundle); 
     return f; 
    } 
} 

MainActivity가

public class MainActivity extends AppCompatActivity { 

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

     ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); 
     viewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager())); 
     viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
      @Override 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

       if (position == 1) { 
        PreviewFragment fragmentB = new PreviewFragment(); 
        EditFragment ef = EditFragment.newInstance(); 
        try{ 
         Log.e("ACTIVITY", ef.getArguments().getString("md"));// Data is available 
        } catch (Exception e){ 
         e.printStackTrace(); 
        } 
        fragmentB.b_updateText(ef.getArguments().getString("md")); 

       } 
      } 

      @Override 
      public void onPageSelected(int position) { 

      } 

      @Override 
      public void onPageScrollStateChanged(int state) { 

      } 
     }); 
    } 

    private class MyPagerAdapter extends FragmentPagerAdapter { 

     public MyPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int pos) { 
      switch(pos) { 

       case 0: return EditFragment.newInstance(); 
       case 1: return new PreviewFragment(); 
       default: return EditFragment.newInstance(); 
      } 
     } 

     @Override 
     public int getCount() { 
      return 2; 
     } 
    } 
} 

하지만 여기에 내가 왜 모르는, NPE를 얻을 수있다.

+1

조각을 사용하여 통신하는 인터페이스에 대해 읽으십시오. –

+0

하지만 viewpager를 사용하여 디스플레이 및 편집 옵션을 나란히 사용하는 이유는 무엇입니까? 이 구현의 실제 목적은 무엇입니까? –

+0

스 와이프하여 조각을 바꿀 때 데이터를 전송 하시겠습니까? –

답변

0

기회가 안드로이드 워드 프로세서를 통과 했습니까?

Communicating with Other Fragments

물론 당신은 오토 또는 EventBus 라이브러리를 사용할 수 있습니다. 또한이 번호는 answer입니다.

0

FragmentManager을 사용하면 findFragmentByTag(<tag of target fragment>)을 호출하여 현재 조각에서 다른 단편에 액세스 할 수 있습니다.

// First Fragment, from we're sending data 

public class MyFragmentA extends Fragment { 

EditText A_input; 
Button A_enter; 

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

A_input = (EditText)myFragmentView.findViewById(R.id.a_input); 
A_enter = (Button)myFragmentView.findViewById(R.id.a_enter); 
A_enter.setOnClickListener(A_enterOnClickListener); 

return myFragmentView; 
} 

OnClickListener A_enterOnClickListener = new OnClickListener(){ 

@Override 
public void onClick(View arg0) { 

String textPassToB = A_input.getText().toString(); 

String TabOfFragmentB = ((MainActivity)getActivity()).getTabFragmentB(); 

MyFragmentB fragmentB = (MyFragmentB)getActivity() 
.getSupportFragmentManager() 
.findFragmentByTag(TabOfFragmentB); 

fragmentB.b_updateText(textPassToB); 

Toast.makeText(getActivity(), 
"text sent to Fragment B:\n " + TabOfFragmentB, 
Toast.LENGTH_LONG).show(); 
}}; 

} 

// Second Fragment, where we'll get data 

public class MyFragmentB extends Fragment { 

TextView b_received; 

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

b_received = (TextView)myFragmentView.findViewById(R.id.b_received); 
String myTag = getTag(); 

((MainActivity)getActivity()).setTabFragmentB(myTag); 

Toast.makeText(getActivity(), 
"MyFragmentB.onCreateView(): " + myTag, 
Toast.LENGTH_LONG).show(); 

return myFragmentView; 
} 

public void b_updateText(String t){ 
b_received.setText(t); 
} 

} 
+0

내 필요에 따라 예제를주세요. viewpager를 사용해야합니다. –

+0

기다려주십시오, 곧 답변을 업데이트하겠습니다. –

+0

그건 너의 종류 야! –

0

MainActivity에서 변수를 만들고

MainActivity mainActivity = (MainActivity) getActivity(); 
mainActivity.message="Hai from EditFragment" 

체크 아웃을 통해 아래 코드 단편에서 해당 변수에 액세스 :

public class MainActivity extends AppCompatActivity { 
    public String message; 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); 
      viewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager())); 
     } 

     private class MyPagerAdapter extends FragmentPagerAdapter { 

      public MyPagerAdapter(FragmentManager fm) { 
       super(fm); 
      } 

      @Override 
      public Fragment getItem(int pos) { 
       switch(pos) { 

        case 0: return EditFragment.newInstance("FirstFragment, Instance 1"); 
        case 1: { 
         Log.e("TAG", " is " + new EditFragment().getTag()); 
         return PreviewFragment.newInstance(new EditFragment().getTag()); 
        } 

        default: return EditFragment.newInstance("ThirdFragment, Default"); 
       } 
      } 

      @Override 
      public int getCount() { 
       return 2; 
      } 
     } 
    } 

EditFragment가

public class EditFragment extends Fragment { 

      public EditFragment(){} 

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

       EditText tv = (EditText) v.findViewById(R.id.content); 
       tv.setText(getArguments().getString("msg")); 
      MainActivity mainActivity = (MainActivity) getActivity(); 
      mainActivity.message="Hai from EditFragment" 
//store data through message variable inside activity 
       return v; 
      } 


     } 

PreviewFragment을

public class PreviewFragment extends Fragment { 

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

      TextView tvView = (TextView) v.findViewById(R.id.markdownView); 
      MainActivity mainActivity = (MainActivity) getActivity(); 

      tvView.loadMarkdown(mainActivity.message);// get data through message variable of main activity 

      return v; 
     } 


    } 
+0

업데이트를 참조하십시오 –

관련 문제