Android - Pass “edit text” element value between t

2019-09-12 03:24发布

问题:

I have an activity with multiple swipe tabbed fragments. Each fragment has some check-boxes, edit text and switch fields. What I want is to navigate through all the tabs, edit the state of the fields then on last tab to collate the information within all the elements and save these details into a database.

My problem is that I don't know how to save these elements values and pass them to my last tab in order to be stored.

I am quite a newbie with Android apps so any hint or answer would be very much appreciated.

Here is how code looks so far:

Activity:

public class IconTextTabsActivity extends AppCompatActivity {

private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;
private int[] tabIcons = {
        R.drawable.ic_tab_favourite,
        R.drawable.ic_tab_call,
        R.drawable.ic_tab_contacts,
        R.drawable.ic_vector_test
};


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

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);

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

    Bundle b = getIntent().getExtras();
    String id = b.getString("id");

    Toast.makeText(this, id, Toast.LENGTH_LONG).show();

}

private void setupTabIcons() {
    tabLayout.getTabAt(0).setIcon(tabIcons[0]);
    tabLayout.getTabAt(1).setIcon(tabIcons[1]);
    tabLayout.getTabAt(2).setIcon(tabIcons[2]);
    tabLayout.getTabAt(3).setIcon(tabIcons[2]);
    tabLayout.getTabAt(4).setIcon(tabIcons[3]);
}

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFrag(new OneFragment(), "ONE");
    adapter.addFrag(new TwoFragment(), "TWO");
    adapter.addFrag(new ThreeFragment(), "THREE");
    adapter.addFrag(new FourFragment(), "FOUR");
    adapter.addFrag(new FiveFragment(), "FIVE");
    viewPager.setAdapter(adapter);
}

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}


@Override
public void onBackPressed() {
    super.onBackPressed();
    overridePendingTransition(R.anim.left_to_right, R.anim.right_to_left);
}

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 addFrag(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

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

Tab Fragment 1

public class OneFragment extends Fragment {

private EditText mBreedName;

public OneFragment() {
    // 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
    View v = inflater.inflate(R.layout.fragment_one, container, false);

    mBreedName = (EditText) v.findViewById(R.id.addName);

    return v;
}

Tab Fragment 2

public class TwoFragment extends Fragment {

public TwoFragment() {
    // 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
    View v = inflater.inflate(R.layout.fragment_two, container, false);

    return v;
}

Assuming that Tab Fragment 2 is my last tab, how could I retrieve here the text value for "mBreedName" stored into Tab Fragment 1?

Thanks!

回答1:

You can store the values in your activity and use a callback to update and query them.

Try this:

On your activity:

public class IconTextTabsActivity extends AppCompatActivity implements ActivityCallback{
    private String mBreedTextName = "";
    ...
    @Override
    public void onEditTextChange(String text) {
        this.mBreedTextName = text;
    }

    @Override
    public String getEditTextName() {
        return mBreedTextName;
    }
}

The ActivityCallback interface:

public interface ActivityCallback {

    void onEditTextChange(String text);

    String getEditTextName();
}

then on your fragment:

public class OneFragment extends Fragment {
    ...
    private ActivityCallback callback;    

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        callback = (ActivityCallback) context;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                     Bundle savedInstanceState) {

    // Inflate the layout for this fragment
    View v = inflater.inflate(R.layout.fragment_one, container, false);
    mBreedName = (EditText) v.findViewById(R.id.addName);
    Button b = v.findViewById(R.id.accept_button);

    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
                callback.onEditTextChange(mBreedName.getText().toString());
            }
        });
        return v;
    }

}

And the same on the second fragment:

public class TwoFragment extends Fragment {

    ...
    private ActivityCallback callback;    
    private String text;
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        callback = (ActivityCallback) context;
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.fragment_two, container, false);
        text = callback.getEditTextName();
        return v;
    }
}