【问题标题】:how to get value from input data fragment with viewpager如何使用 viewpager 从输入数据片段中获取值
【发布时间】:2017-09-07 04:25:56
【问题描述】:

我在 1 个活动中有 4 个片段(MainActivity:ViewPager)

fragment1 = edittext1,fragment2 = edittext2,fragment3 = edittext3 & fragment4 = 按钮保存

在片段 4 中只有一个保存按钮可以从片段 1,2 和 3 中检索数据 但是当我单击按钮保存时,来自 fragment1 的数据始终为空

MainActivity:

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.pager);
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new FragmentOne(), "FRAG1");
    adapter.addFragment(new FragmentTwo(), "FRAG2");
    adapter.addFragment(new FragmentThree(), "FRAG3");
    adapter.addFragment(new FragmentFour(), "FRAG4");
    viewPager.setAdapter(adapter);

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);
}

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

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

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

片段 1,2 和 3

public class FragmentOne extends Fragment {
public FragmentOne() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment

    return inflater.inflate(R.layout.fragment_one, container, false);
}

}

片段4

public class FragmentFour extends Fragment {

private EditText txt1, txt2, txt3;
private Button button;

public FragmentFour() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view =  inflater.inflate(R.layout.fragment_four, container, false);

    txt1 = (EditText)getActivity().findViewById(R.id.txt1);
    txt2 = (EditText)getActivity().findViewById(R.id.txt2);
    txt3 = (EditText)getActivity().findViewById(R.id.txt3);

    button = (Button)view.findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            getData();
        }
    });
    return view;
}

private void getData() {
    String fragment1 = txt1.getText().toString();
    String fragment2 = txt2.getText().toString();
    String fragment3 = txt3.getText().toString();
}

空问题

来自 text1(片段)的数据始终为空:

我应该怎么做才能解决这个问题?

非常感谢...

【问题讨论】:

  • 你可以使用静态变量
  • 片段 2 的数据呢?

标签: android android-activity mobile android-viewpager fragment


【解决方案1】:

您必须使用 共享偏好 来存储 FragmentOne 数据,FragmentTwo 数据,然后在保存按钮上检索到 FragmentTree

【讨论】:

    【解决方案2】:

    您可以为此目的使用共享偏好

    创建共享首选项

    SharedPreferences pref = getApplicationContext().getSharedPreferences("DATA", MODE_PRIVATE); 
    Editor editor = pref.edit();
    editor.putString("EDITEXT1", "string value");  // Saving string data of your editext
    editor.commit(); // commit and save your data in to SharedPreferences
    

    现在像下面的代码一样检索您的数据

    SharedPreferences pref = getApplicationContext().getSharedPreferences("DATA", MODE_PRIVATE); 
    String email=pref.getString("EDITEXT1", "");       // Saving string data of your editext
    

    【讨论】:

      【解决方案3】:

      您可以使用Arguments在片段之间传递数据,例如

      Bundle bundle = new Bundle();
      bundle.putString("someEditTextData",someEditTextData);
      SomeFragment fragment = new SomeFragment ();
      fragment.setArguments(bundle);
      

      并检索所需片段中的数据,如下所示

      Bundle args = getArguments();
          if (args != null) {
              showReceivedData.setText(args.getString("someEditTextData"));
          }
      

      【讨论】:

        【解决方案4】:

        您可以在 Activity 中定义一个实例字段,并可以通过将 getActivity() 引用向上转换为 Fragment 中的 MainActivity 来访问它。

        ((MainActivity) getActivity()).filedName.setFragmentOneData(data);
        

        【讨论】:

          【解决方案5】:

          viewPager 总是加载 1 个连续页面,如果你想访问 Fragment 1 editText 数据然后添加这一行

           viewPager.setOffscreenPageLimit(4);
          

          或 使用静态变量

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多