簡體   English   中英

無法將數據從片段傳遞到 ViewPager 中的其他片段

[英]can not pass data from on fragment to other in ViewPager

我在一個頁面中有一個帶有 viewpager 的 Activity 應該是 EditText,另一個頁面是 TextView,從第一個片段獲取數據以顯示在第二個視圖中,但由於缺乏知識,我正在努力,我有 Main Activity 作為

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"
        />

編輯片段是

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;
    }
}

預覽片段

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;
    }
}

我不知道如何將數據從 EditFragment 傳遞到 PreviewFragment,請幫忙。

我是 Fragments 的新手,請幫助我。

更新

我變了

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;
    }
}

主要活動是

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,不知道為什么。

你有機會瀏覽 android 文檔嗎?

與其他片段通信

當然,您可以使用 Otto 或 EventBus 庫。 也看看這個答案

使用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);
}

}

在 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;
            }
        }
    }

編輯片段是

  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;
            }


        }

預覽片段

 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;
        }


    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM