2016-09-22 7 views
-2

ビューページでのアクティビティがEditTextで、他のページがTextViewである必要があります。最初のフラグメントからデータを取得して2番目のビューに表示しますが、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

私の必要に応じて例を挙げてください。閲覧ページャを使用する必要があります。 –

+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

更新を参照してください –

関連する問題