Android 将数据从一个设计选项卡传递到另一个选项卡

Android 将数据从一个设计选项卡传递到另一个选项卡,android,android-viewpager,android-support-library,android-tabs,Android,Android Viewpager,Android Support Library,Android Tabs,我使用的材质设计选项卡如下所示: 以下是我的MainActivity.class: public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener { private TabLayout tabLayout; private ViewPager viewPager; @Override protected void onCreate(B

我使用的材质设计选项卡如下所示:

以下是我的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;
    }
}
这是另一个名为Fragment2的片段:

 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");
    }
}
在第二个片段中,我得到的是数据,但它与前一个视图添加了另一个视图。 如图所示:

所以我想在两种情况下将数据从碎片一传递到碎片二:
1.我想在单击按钮时传递数据,
2.当我滑动到碎片时,应该传递两个数据

另外,当我尝试滑动到FragmentTwo时,FragmentTwo中没有调用任何东西?为什么会这样? 另外,当我单击第二个选项卡时,不会调用任何内容。 请帮助我如何在单击按钮时将数据传递到FragmentTwo

以下是布局文件: 这是你的一个

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


每个片段都与父活动相关。所以你不能直接从一个片段到另一个片段进行通信。您将需要使用接口完成父活动

检查以下文档:

单击按钮,将值传递给自定义界面中的方法,并在第二个片段中访问这些方法

当我尝试滑动到FragmentTwo时,FragmentTwo中没有调用任何内容

为此,您需要实现片段生命周期-

更新

在代码中做了一些修改后,只需看看下面的代码。代码-

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>
FragmentTwo.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;
        }
    }
}
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;
    }
}
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");
    }

}
布局文件中没有更改。只要试一下上面的代码——它完全按照您的意愿工作。希望这会有帮助

屏幕
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是bundle对象,您可以在fragment的onCreateView方法的下面代码中的fragment use中使用字符串int和其他值来使用这些值

int codeForthisFragment = getArguments().getInt("code");
对于按钮单击: FragmentTransaction ft=getFragmentManager().beginTransaction(); Fragment secondFragment=新的FragmentTwo()

在第二个片段中,我得到的是数据,但它与前一个视图添加了另一个视图。看到图片了吗

关于@Roy Miller()的答案, 您可以通过执行以下更改来解决此问题:

MainActivity.java中,更换以下开关:

 @Override
    public Fragment getItem(int position) {

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

然后,在FragmentOne.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;
        }
    }
}
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;
    }
}
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");
    }

}
替换此项:

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();
        }
    });
与:

现在在FragmentTwo.java中 添加方法:

public void updateTextView(String data){
    Log.d("TabTwo","Update Text view");
    TextView txt = (TextView)view.findViewById(R.id.textView2);
    txt.setText(data);
}
最后,我在上面提到的singleton类:

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;
}
}
公共类碎片集合{
静态FragmentCollection FragmentCollection=新FragmentCollection();
私有最终列表MFFragmentList=new ArrayList();
私有碎片集合(){}
公共静态碎片集合getInstance(){
if(fragmentCollection!=null){
返回碎片收集;
}否则{
返回新的FragmentCollection();
}
}
公共void setmFragmentList(列表mFragmentList){
这个.MFFragmentList.addAll(MFFragmentList);
}
公共列表getmFragmentList(){
返回MFFragmentList;
}
}
使旧视图重叠的问题是因为一次又一次地初始化片段

就像新的碎片一样;在不止一个地方


所以在这里,我们把它放在一个列表中并访问它,这样只有一个片段被改变。

我无法从第二个片段转到第一个片段。我正在使用选项卡布局 这是我的密码 点击第二个片段中的按钮

            Bundle bundle = new Bundle();
            bundle.putString("uniqueList1", uniqueList.get(0));
            bundle.putString("uniqueList2", uniqueList.get(1));
            bundle.putString("kycUniquesNo", kycUniqueNum);
            CustBasicFormFragement fragObj = new CustBasicFormFragement();
            fragObj.setArguments(bundle);
   @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle 
     savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    binding = DataBindingUtil.inflate(inflater, R.layout.cust_basic_form_fragment, container, false);
    view = binding.getRoot();

    if (getArguments() != null) {
         string1 = getArguments().getString("uniqueList1");
         string2 = getArguments().getString("uniqueList2");
         kycUnique=getArguments().getString("kycUniquesNo");
        System.out.print(string1);
        System.out.print(string2);
        System.out.print(kycUnique);
    return view;

}
第一段

            Bundle bundle = new Bundle();
            bundle.putString("uniqueList1", uniqueList.get(0));
            bundle.putString("uniqueList2", uniqueList.get(1));
            bundle.putString("kycUniquesNo", kycUniqueNum);
            CustBasicFormFragement fragObj = new CustBasicFormFragement();
            fragObj.setArguments(bundle);
   @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle 
     savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    binding = DataBindingUtil.inflate(inflater, R.layout.cust_basic_form_fragment, container, false);
    view = binding.getRoot();

    if (getArguments() != null) {
         string1 = getArguments().getString("uniqueList1");
         string2 = getArguments().getString("uniqueList2");
         kycUnique=getArguments().getString("kycUniquesNo");
        System.out.print(string1);
        System.out.print(string2);
        System.out.print(kycUnique);
    return view;

}

但您正在适配器中设置数据,如果我在FragmentOne中单击我的按钮,这会起作用吗?我已经做了您所说的一切,但它在第二个片段中添加了双视图。@swanandvaidya转到您的XML文件,并在您的片段元素中将背景色设置为白色或任何您需要的颜色want@swanandvaidya请投票选出对你有帮助的答案如果答案正确,请选择“接受”。我的问题尚未解决,因此我不打算投票。你能提供代码吗?因为我是Android编程新手,我阅读了链接,但我没有得到它。请在代码中添加??检查以下链接-1)2)我希望它现在能工作,如果不是让我知道的话。我会给你示例代码。我已经编辑了我的代码。请看我更新的代码和图片,这样你会有一个想法。好的,现在你在第二个片段中获得数据,但问题是-第一个片段的数据也添加到第二个片段的视图中,我说的对吗?不,我在第二个片段中已经有了3个文本视图,当我点击第一个片段中的按钮时,我得到了6个文本视图。你能运行这个代码吗?你会知道到底发生了什么?请让我知道我要做什么?任何帮助都将不胜感激,谢谢