0

Я использую дизайн материал вкладки следующим образом:передавать данные из одной вкладки дизайна на другую вкладку

Ниже мой MainActivity.class:

public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener { 

    private TabLayout tabLayout; 
    private ViewPager viewPager; 

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

     tabLayout = (TabLayout) findViewById(R.id.tabs); 
     viewPager = (ViewPager) findViewById(R.id.viewpager); 
     ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
     viewPager.setAdapter(adapter); 
     viewPager.addOnPageChangeListener(this); 
     tabLayout.setupWithViewPager(viewPager); 

    } 

    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

    } 

    @Override 
    public void onPageSelected(int position) { 
     System.out.println("onPageSelected Called"); 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) { 

    } 
} 

Мой ViewPagerAdapter выглядит следующим образом:

public class ViewPagerAdapter extends FragmentPagerAdapter { 

    private static int count = 2; 

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

    @Override 
    public Fragment getItem(int position) { 

     switch (position) { 
      case 0: 
       return new FragmentOne(); 
      case 1: 
       return new FragmentTwo(); 
     } 
     return null; 
    } 

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

    @Override 
    public CharSequence getPageTitle(int position) { 
     switch (position) 
     { 
      case 0 : 
       return "Tab One"; 
      case 1 : 
       return "Tab Two"; 
     } 
     return null; 
    } 
} 

и здесь мои фрагменты:

Это мое первое имя фрагмента FragmentOne:

public class FragmentOne extends Fragment { 

    private EditText editText; 
    private Button btnSendData; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     System.out.println("IN FRAGMENT ONE"); 
     View view = inflater.inflate(R.layout.fragment_one,container,false); 

     editText = (EditText) view.findViewById(R.id.et_name); 
     btnSendData = (Button) view.findViewById(R.id.btn_send); 

     btnSendData.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       FragmentTwo fragment = new FragmentTwo(); 
       Bundle bundle = new Bundle(); 
       bundle.putString("username",editText.getText().toString()); 
       fragment.setArguments(bundle); 
       getFragmentManager.beginTransaction.replace(R.id.frag_second,fragment).commit(); 

      } 
     }); 

     return view; 
    } 
} 

и вот еще один фрагмент с именем FragmentTwo:

public class FragmentTwo extends Fragment { 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     System.out.println("IN FRAGMENT TWO"); 
     View view = inflater.inflate(R.layout.fragment_two,container,false); 
     Bundle bundle = getArguments(); 
     if(bundle!= null) 
     { 
      String value = getArguments().getString("username"); 
     } 
     return view; 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     System.out.println("onResume gets called"); 
    } 
} 

Во втором фрагменте я получаю данные Буц его добавление другого вида с предыдущим. увидеть изображение:

enter image description here

поэтому я хочу, чтобы передать данные от FragmentOne к FragmentTwo в два сценария:
1. Я хочу передать данные, когда я нажимаю на кнопку и
2. Когда я проведите пальцем по FragmentTwo данные должны быть пройдены

Также, когда я пытаюсь прокрутить до FragmentTwo, ничего не вызвано в FragmentTwo? почему это так ? Также, когда я нажимаю на вторую вкладку, ничего не вызывается. Пожалуйста, помогите мне, как я должен передавать данные в FragmentTwo при нажатии кнопки?

следующие файлы разметки: здесь fragment_one

<LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="center" 
     android:orientation="vertical"> 
      <EditText 
       android:layout_marginLeft="16dp" 
       android:layout_marginRight="16dp" 
       android:id="@+id/et_name" 
       android:hint="Username" 

       android:layout_width="match_parent" 
       android:layout_height="wrap_content"/> 

      <Button 
       android:padding="16dp" 
       android:text="Send Data" 
       android:layout_marginLeft="16dp" 
       android:layout_marginRight="16dp" 
       android:id="@+id/btn_send" 
       android:layout_height="wrap_content" 
       android:layout_width="match_parent"/> 

и второй фрагмент, fragment_second.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:id="@+id/second_frag" 
android:gravity="center"> 
<TextView 
    android:textSize="24sp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:text="Fragment Two" 
    android:id="@+id/textView2" /> 

ответ

0

Каждый фрагмент связан с родителем Мероприятия. поэтому вы не можете напрямую обмениваться данными с одним фрагментом на другой фрагмент. Вам нужно будет пройти через Parent Activity с помощью интерфейса.

Проверьте это документы: https://developer.android.com/training/basics/fragments/communicating.html

На кнопку мыши передать значение методов в пользовательском интерфейсе и получить доступ к этим методам во втором фрагменте.

при попытке стащить не FragmentTwo ничего не вызывается в FragmentTwo

Для этого необходимо реализовать фрагмент жизненного цикла - https://developer.android.com/reference/android/app/Fragment.html

UPDATE

Совершено с некоторыми изменениями в вашем коде, просто посмотрите на foll.Код -

Manifex.xml

<application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity" 
      android:theme="@style/Theme.AppCompat.NoActionBar"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

MainActivity.java

package com.app.onkar.tabdemo; 

import android.support.v4.app.Fragment; 
import android.support.design.widget.TabLayout; 

import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.Toolbar; 

import java.util.ArrayList; 
import java.util.List; 

public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener { 

    private Toolbar toolbar; 
    private TabLayout tabLayout; 
    private ViewPager viewPager; 

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

     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     viewPager = (ViewPager) findViewById(R.id.viewpager); 
     tabLayout = (TabLayout) findViewById(R.id.tabs); 


     ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 

     adapter.addFragment(new FragmentOne(), "ONE"); 
     adapter.addFragment(new FragmentTwo(), "TWO"); 
     viewPager.setAdapter(adapter); 

     viewPager.addOnPageChangeListener(this); 
     tabLayout.setupWithViewPager(viewPager); 
    } 

    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

    } 

    @Override 
    public void onPageSelected(int position) { 
     System.out.println("onPageSelected Called"); 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) { 

    } 

    public static class ViewPagerAdapter extends FragmentPagerAdapter { 
     private final List<Fragment> mFragmentList = new ArrayList<>(); 
     private final List<String> mFragmentTitleList = new ArrayList<>(); 
     private static int count = 2; 

     public void addFragment(Fragment fragment, String title) { 
      mFragmentList.add(fragment); 
      mFragmentTitleList.add(title); 
     } 

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

     @Override 
     public Fragment getItem(int position) { 

      switch (position) { 
       case 0: 
        return new FragmentOne(); 
       case 1: 
        return new FragmentTwo(); 
      } 
      return null; 
     } 

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

     @Override 
     public CharSequence getPageTitle(int position) { 
      switch (position) { 
       case 0: 
        return "Tab One"; 
       case 1: 
        return "Tab Two"; 
      } 
      return null; 
     } 
    } 
} 

FragmentOne.java

package com.app.onkar.tabdemo; 

import android.content.Context; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.EditText; 

public class FragmentOne extends Fragment { 
    private EditText editText; 
    private Button btnSendData; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     System.out.println("IN FRAGMENT ONE"); 
     View view = inflater.inflate(R.layout.fragment_one,container,false); 

     editText = (EditText) view.findViewById(R.id.et_name); 
     btnSendData = (Button) view.findViewById(R.id.btn_send); 

     btnSendData.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       FragmentTwo fragment = new FragmentTwo(); 
       Bundle bundle = new Bundle(); 
       bundle.putString("username",editText.getText().toString()); 
       fragment.setArguments(bundle); 
       getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.second_frag,fragment).commit(); 
      } 
     }); 

     return view; 
    } 
} 

не FragmentTwo.java

package com.app.onkar.tabdemo; 


import android.support.v4.app.Fragment; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 


public class FragmentTwo extends Fragment { 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     System.out.println("IN FRAGMENT TWO"); 
     View view = inflater.inflate(R.layout.fragment_two,container,false); 
     TextView txt2 = (TextView) view.findViewById(R.id.textView2); 
     Bundle bundle = getArguments(); 
     if(bundle!= null) 
     { 
      String value = getArguments().getString("username"); 
      txt2.setText(value); 
     } 
     return view; 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     System.out.println("onResume gets called"); 
    } 

} 

Никаких изменений в раскладка. Просто попробуйте код выше - он работает именно так, как вы хотите. Надеюсь, это поможет!

ЭКРАНЫ enter image description here enter image description here

+0

Можете ли вы предоставить код, поскольку я новичок в программировании на Android, я прочитал ссылку, но я ее не понял. Можете добавить в код код? –

+0

Проверьте следующие ссылки - 1) http://stackoverflow.com/questions/7149802/how-to-transfer-some-data-to-another-fragment 2) http://stackoverflow.com/questions/16036572/how -to-pass-values-between-fragments Я надеюсь, что это сработает сейчас, если не просто дайте мне знать. Я дам вам образец кода. –

+0

Я отредактировал мой код, пожалуйста, просмотрите мой обновленный код, а также просмотрите изображение, чтобы вы получили представление. –

0

класса ViewPagerAdapter

public class ViewPagerAdapter extends FragmentPagerAdapter { 

private static int count = 2; 


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

@Override 
public Fragment getItem(int position) { 

switch (position) { 
    case 0: 
     Fragment fragmentone = new FragmentOne(); 
     Bundle args = new Bundle(); 
     args.putInt("code", 1); 
     fragmentone.setArguments(args); 
     return fragmentone; 
    break; 
    case 1: 
     Fragment fragmenttwo = new FragmentTwo(); 
     Bundle args = new Bundle(); 
     args.putInt("code", 2); 
     fragmenttwo.setArguments(args); 
     return fragmenttwo ; 
     break; 
} 
return null; 
} 

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

@Override 
public CharSequence getPageTitle(int position) { 
switch (position) 
{ 
    case 0 : 
     return "Tab One"; 
    case 1 : 
     return "Tab Two"; 
} 
return null; 
} 
} 

Args является объектом расслоением, вы можете поместить Струнный Int и другие значения, чтобы использовать эти значения при использовании фрагмента ниже кода в методе onCreateView фрагмента. .

int codeForthisFragment = getArguments().getInt("code"); 

для нажатия кнопки: FragmentTransaction фут = getFragmentManager() BeginTransaction(); Фрагмент secondFragment = new FragmentTwo();

    Bundle args = new Bundle(); 
        args.putInt("code", 2); 
        secondFragment.setArguments(args); 
        ft.replace(R.id.content_frame, secondFragment); 
        ft.commit(); 
+0

Но вы устанавливаете данные в Adapter, это будет работать, если я нажму на свою кнопку из FragmentOne? –

+0

Я сделал все, что вы сказали, но добавил двойные представления во втором фрагменте. –

+0

@swanandvaidya перейдите в свой XML-файл, и в вашем элементе фрагмента установите цвет фона на белый или что-нибудь, что вы хотите –

0

Во втором фрагменте я получаю данные Буц его добавление другого вида с предыдущим. увидеть изображение

Со ссылкой на ответ по @Roy Миллер (https://stackoverflow.com/users/5255021/roy-miller), вы можете решить, выполнив follwing изменения:

В MainActivity.java, замените follwing переключатель:

@Override 
    public Fragment getItem(int position) { 

     switch (position) { 
      case 0: 
       return new FragmentOne(); 
      case 1: 
       return new FragmentTwo(); 
     } 
     return null; 
    } 

С:

@Override 
public Fragment getItem(int position) { 

    switch (position){ 
     case 0: 
      return mFragmentList.get(0); 
     case 1: 
      return mFragmentList.get(1); 
     case 2: 
      return mFragmentList.get(2); 
     default: 
      return null; 
    } 

} 

А потом, в FragmentOne.java

Заменить это:

btnSendData.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      FragmentTwo fragment = new FragmentTwo(); 
      Bundle bundle = new Bundle(); 
      bundle.putString("username",editText.getText().toString()); 
      fragment.setArguments(bundle); 
      getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.second_frag,fragment).commit(); 
     } 
    }); 

С:

btnSendData.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

/*This one FragmentCollection is a Singleton class that contains list of fragments, set it during initialization itself(code is attached below this code)*/ 
FragmentCollection fragmentCollection=FragmentCollection.getInstance(); 

      FragmentTwo fragment = (FragmentTwo) FragmentCollection.getmFragmentList().get(2); //getting the second fragment 

      fragment.setText(editText.getText().toString()); //add this method in fragment two    

     } 
    }); 

Теперь внутри FragmentTwo.Java Добавить метод:

public void updateTextView(String data){ 
    Log.d("TabTwo","Update Text view"); 
    TextView txt = (TextView)view.findViewById(R.id.textView2); 
    txt.setText(data); 
} 

Наконец, класс синглтона я упоминал выше:

public class FragmentCollection { 
static FragmentCollection fragmentCollection=new FragmentCollection(); 
private final List<Fragment> mFragmentList = new ArrayList<>();  
private FragmentCollection(){} 
public static FragmentCollection getInstance(){ 
    if(fragmentCollection!=null) { 
     return fragmentCollection; 
    }else { 
     return new FragmentCollection(); 
    } 
} 
public void setmFragmentList(List<Fragment> mFragmentList){ 
    this.mFragmentList.addAll(mFragmentList); 
} 
public List<Fragment> getmFragmentList(){ 
    return mFragmentList; 
} 
} 

Вопрос о получении старых взглядов перекрывающихся из-за инициализации фрагмента снова и снова

как новый FragmentTwo(); в более чем одном месте.

Итак, мы помещаем его в список и получаем доступ к нему, поэтому изменяется только один фрагмент.

Смежные вопросы