Как я могу обмениваться данными черно-белых фрагментов с помощью интерфейса. Я хочу, чтобы при нажатии кнопки «Редактировать данные текста в фрагменте 1» отображалось текстовое представление фрагмента 2. - PullRequest
0 голосов
/ 27 ноября 2018

Основной класс

public class MainActivity extends AppCompatActivity implements TabLayout.OnTabSelectedListener, MyInterface {

    ViewPager vp;
    TabLayout tabLayout;

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

        vp = (ViewPager) findViewById(R.id.mViewpager_ID);
        this.addPages();
        tabLayout = (TabLayout) findViewById(R.id.mTab_ID);
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
        tabLayout.setupWithViewPager(vp);
        tabLayout.setOnTabSelectedListener(this);
    }

    private void addPages() {
        MyPagerAdapter pagerAdapter = new MyPagerAdapter(this.getSupportFragmentManager());
        pagerAdapter.addFragment(new Fragment1());
        pagerAdapter.addFragment(new Fragment2());
        pagerAdapter.addFragment(new Fragment3());
        vp.setAdapter(pagerAdapter);
    }

    public void onTabSelected(TabLayout.Tab tab) {
        vp.setCurrentItem(tab.getPosition());
    }
    @Override
    public void onTabUnselected(TabLayout.Tab tab) {
    }

    @Override
    public void onTabReselected(TabLayout.Tab tab) {
    }
    @Override
    public String setOnDataChangedListener(String Text) {
    return Text;
    }
    @Override
    public void onFragmentChanged(int value) {
        if (value == 0) {
            vp.setCurrentItem(value);
            }
            if (value == 1) {
            vp.setCurrentItem(value);
             }
          if (value == 2) {
            vp.setCurrentItem(value);
        }
    }}

Фрагмент 1:

public class Fragment1 extends Fragment {
    private MyInterface obj;
    String a;
    Context c;
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        obj = (MyInterface) context;
          }
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView=inflater.inflate(R.layout.activity_fragment1,container,false);
        EditText edttext=(EditText)rootView.findViewById(R.id.edttxt);
        final String data=edttext.getText().toString();
        a="testing_communication";
        Button btn=(Button)rootView.findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                obj.setOnDataChangedListener(data);
                obj.onFragmentChanged(1);
             } 
           });
        return rootView;
    }
    @Override
    public String toString() {
        String title="Fragment:1";
        return title;}}

Фрагмент2: ..

public class Fragment2 extends Fragment implements MyInterface {
@Nullable

TextView tv;
String text;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View bootView2=inflater.inflate(R.layout.activity_fragment2,container,false);
    tv = (TextView) bootView2.findViewById(R.id.textv);
    setOnDataChangedListener(text);
    tv.setText(text);
    return bootView2;

}

@Override
public String toString() {
    String title="Fragment:2";
    return title;
}

@Override
public String setOnDataChangedListener(String Text) {
return Text;
}
@Override
public void onFragmentChanged(int value) {
 }
 }

Интерфейс:

public interface MyInterface {
String setOnDataChangedListener(String Text);
void onFragmentChanged(int value);}

Pageadabter is:

public class MyPagerAdapter extends FragmentPagerAdapter {
ArrayList<Fragment> fragments=new ArrayList<>();
public MyPagerAdapter(FragmentManager fm) {
    super(fm);
}
@Override
public Fragment getItem(int position) {
    return fragments.get(position);
}
@Override
public int getCount() {
    return fragments.size();
}
public void addFragment(Fragment f)
{
    fragments.add(f);
}
@Override
public CharSequence getPageTitle(int position) {
    String title=fragments.get(position).toString();
    return title.toString();
}}

При нажатии кнопки фрагмент1, я могу перемещаться по фрагменту2, но не могу перейти с данными. Похоже, что фрагмент1 находится под фрагментом тела1 onclicklistener obj.onFragmentChanged (1);работает нормально. но obj.setOnDataChangedListener (data.);не работает .. Если кто-нибудь может помочь, я буду очень благодарен вам.

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Здесь много проблем.Двумя, которые вызывают эту проблему, в основном

Во-первых, во Fragment1 вы приводите контекст как MyInterface и используете его для установки данных.В этом случае контекстом будет действие, содержащее Fragment1, а не Fragment2

Во-вторых, ваш setDataChangedListener практически ничего не делает.Он получает строку, а затем возвращает ту же самую вещь, нигде не сохраняя ее.

Вам необходим Fragment2 для реализации setDataChangedListener, получения String и последующего сохранения его в переменной класса.

0 голосов
/ 30 ноября 2018

Это https://www.journaldev.com/14207/android-passing-data-between-fragments#comment-45206 помогло мне разобраться в проблеме.

0 голосов
/ 27 ноября 2018

Вы действительно хотите поделиться данными, используя интерфейс?Вы можете обмениваться данными, используя Bundle или открытое поле MainActivity.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...