Java 当用户滑动时,将EditText.getText从FirstFragment传递到SecondFragment

Java 当用户滑动时,将EditText.getText从FirstFragment传递到SecondFragment,java,android,android-fragments,android-viewpager,swipe,Java,Android,Android Fragments,Android Viewpager,Swipe,我想做的: 在FirstFragment中,用户可以输入他的体重。 在SecondFragment中,重量应显示在文本视图中 该值应在用户刷卡时传递。 我试着绕过3个操作指南,读了很多关于碎片的内容,但仍然找不到合适的解决方案。由于我对片段有点陌生,也可能是我用了一种不寻常的方法来生成片段,因此它不起作用,但我还没弄明白 正如您可以使用unernath一样,实际上代码中有一个错误,因为我试图通过main活动访问FirstFragment的方法 简单地说,我不发布两个片段xlm的全部代码。 首先,

我想做的:
在FirstFragment中,用户可以输入他的体重。
在SecondFragment中,重量应显示在文本视图中
该值应在用户刷卡时传递。

我试着绕过3个操作指南,读了很多关于碎片的内容,但仍然找不到合适的解决方案。由于我对片段有点陌生,也可能是我用了一种不寻常的方法来生成片段,因此它不起作用,但我还没弄明白

正如您可以使用unernath一样,实际上代码中有一个错误,因为我试图通过main活动访问FirstFragment的方法

简单地说,我不发布两个片段xlm的全部代码。
首先,frag.xml有一个EditText(id:getWeight)框,在该框中最多只能输入3位数字
second_frag.xml有一个文本视图(id:txtAlcLvl)

activity_main.xml:

<android.support.v4.view.ViewPager
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/viewPager"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
/>
FirstFragment.java:

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 FirstFragment extends Fragment implements MainActivity.YourFragmentInterface {

    Button btnBeer;
    Button btnBeerSmall;
    Button btnWine;
    Button btnLiq;
    Button btnSch;
    Button btnWater;
    Button btnMale;
    Button btnFemale;
    Calculator calc;
    EditText getWeight;

    public String getWeight(){
        return getWeight.getText().toString();
    }

    @Override
    public void fragmentBecameVisible() {



        // You can do your animation here because we are visible! (make sure onViewCreated has been called too and the Layout has been laid. Source for another question but you get the idea.
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.first_frag, container, false);
        calc = ((MainActivity) getActivity()).getCalc();

        btnBeer = (Button) v.findViewById(R.id.btnBeer);
        btnBeerSmall = (Button) v.findViewById(R.id.btnBeerSmall);
        btnWine = (Button) v.findViewById(R.id.btnWine);
        btnLiq = (Button) v.findViewById(R.id.btnLiq);
        btnSch = (Button) v.findViewById(R.id.btnSch);
        btnWater = (Button) v.findViewById((R.id.btnWater));
        btnMale = (Button) v.findViewById(R.id.btnMale);
        btnFemale = (Button) v.findViewById(R.id.btnFemale);
        getWeight = (EditText) v.findViewById(R.id.getWeight);

        btnBeer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                calc.addConsumption(0);
            }
        });

        btnBeerSmall.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                calc.addConsumption(1);
            }
        });

        btnWine.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                calc.addConsumption(2);
            }
        });

        btnLiq.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                calc.addConsumption(3);
            }
        });

        btnSch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                calc.addConsumption(4);
            }
        });

        btnWater.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                calc.addConsumption(5);
            }
        });

        btnMale.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                btnMale.setBackgroundResource(R.drawable.male_false);
                btnFemale.setBackgroundResource(R.drawable.female);
            }
        });

        btnFemale.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                btnFemale.setBackgroundResource(R.drawable.female_false);
                btnMale.setBackgroundResource(R.drawable.male);
            }
        });


        return v;

    }

    public static FirstFragment newInstance(String text) {

        FirstFragment f = new FirstFragment();
        Bundle b = new Bundle();
        b.putString("msg", text);


        f.setArguments(b);

        return f;
    }
}
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.ImageButton;
import android.widget.TextView;



public class SecondFragment extends Fragment implements MainActivity.YourFragmentInterface {


    TextView txtAlcLvl;
    TextView txtTimeToZero;
    TextView txtPeak;
    ImageButton btnReset;
    Calculator calc;
    String weight;



    @Override
    public void fragmentBecameVisible() {
        calc.person.setSex(false);
        calc.person.setWeight(80);
        txtAlcLvl.setText(((MainActivity) getActivity()).getWeight());
        //txtAlcLvl.setText(String.format("%.2f", calc.getCurrentLevel()) + "‰");

        // You can do your animation here because we are visible! (make sure onViewCreated has been called too and the Layout has been laid. Source for another question but you get the idea.
    }

    public void setSex(){

    }

    public void setWeight(){
        try{

        }   catch(NumberFormatException e){

        }
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.second_frag, container, false);
        calc = ((MainActivity) getActivity()).getCalc();
        String myTag = getTag();
        ((MainActivity)getActivity()).setTabFragmentB(myTag);

        txtAlcLvl = (TextView) v.findViewById(R.id.txtAlcLvl);
        txtTimeToZero = (TextView) v.findViewById(R.id.txtTimeToZero);
        txtPeak = (TextView) v.findViewById(R.id.txtPeak);
        btnReset = (ImageButton) v.findViewById((R.id.btnReset));

        btnReset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                calc.resetConsumption();
            }
        });

        return v;
    }

    public void updateText(String t){
        txtAlcLvl.setText(t);
    }

    public static SecondFragment newInstance(String text) {

        SecondFragment f = new SecondFragment();
        Bundle b = new Bundle();
        b.putString("msg", text);

        f.setArguments(b);

        return f;
    }
}
SecondFragment.java:

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 FirstFragment extends Fragment implements MainActivity.YourFragmentInterface {

    Button btnBeer;
    Button btnBeerSmall;
    Button btnWine;
    Button btnLiq;
    Button btnSch;
    Button btnWater;
    Button btnMale;
    Button btnFemale;
    Calculator calc;
    EditText getWeight;

    public String getWeight(){
        return getWeight.getText().toString();
    }

    @Override
    public void fragmentBecameVisible() {



        // You can do your animation here because we are visible! (make sure onViewCreated has been called too and the Layout has been laid. Source for another question but you get the idea.
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.first_frag, container, false);
        calc = ((MainActivity) getActivity()).getCalc();

        btnBeer = (Button) v.findViewById(R.id.btnBeer);
        btnBeerSmall = (Button) v.findViewById(R.id.btnBeerSmall);
        btnWine = (Button) v.findViewById(R.id.btnWine);
        btnLiq = (Button) v.findViewById(R.id.btnLiq);
        btnSch = (Button) v.findViewById(R.id.btnSch);
        btnWater = (Button) v.findViewById((R.id.btnWater));
        btnMale = (Button) v.findViewById(R.id.btnMale);
        btnFemale = (Button) v.findViewById(R.id.btnFemale);
        getWeight = (EditText) v.findViewById(R.id.getWeight);

        btnBeer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                calc.addConsumption(0);
            }
        });

        btnBeerSmall.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                calc.addConsumption(1);
            }
        });

        btnWine.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                calc.addConsumption(2);
            }
        });

        btnLiq.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                calc.addConsumption(3);
            }
        });

        btnSch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                calc.addConsumption(4);
            }
        });

        btnWater.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                calc.addConsumption(5);
            }
        });

        btnMale.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                btnMale.setBackgroundResource(R.drawable.male_false);
                btnFemale.setBackgroundResource(R.drawable.female);
            }
        });

        btnFemale.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                btnFemale.setBackgroundResource(R.drawable.female_false);
                btnMale.setBackgroundResource(R.drawable.male);
            }
        });


        return v;

    }

    public static FirstFragment newInstance(String text) {

        FirstFragment f = new FirstFragment();
        Bundle b = new Bundle();
        b.putString("msg", text);


        f.setArguments(b);

        return f;
    }
}
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.ImageButton;
import android.widget.TextView;



public class SecondFragment extends Fragment implements MainActivity.YourFragmentInterface {


    TextView txtAlcLvl;
    TextView txtTimeToZero;
    TextView txtPeak;
    ImageButton btnReset;
    Calculator calc;
    String weight;



    @Override
    public void fragmentBecameVisible() {
        calc.person.setSex(false);
        calc.person.setWeight(80);
        txtAlcLvl.setText(((MainActivity) getActivity()).getWeight());
        //txtAlcLvl.setText(String.format("%.2f", calc.getCurrentLevel()) + "‰");

        // You can do your animation here because we are visible! (make sure onViewCreated has been called too and the Layout has been laid. Source for another question but you get the idea.
    }

    public void setSex(){

    }

    public void setWeight(){
        try{

        }   catch(NumberFormatException e){

        }
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.second_frag, container, false);
        calc = ((MainActivity) getActivity()).getCalc();
        String myTag = getTag();
        ((MainActivity)getActivity()).setTabFragmentB(myTag);

        txtAlcLvl = (TextView) v.findViewById(R.id.txtAlcLvl);
        txtTimeToZero = (TextView) v.findViewById(R.id.txtTimeToZero);
        txtPeak = (TextView) v.findViewById(R.id.txtPeak);
        btnReset = (ImageButton) v.findViewById((R.id.btnReset));

        btnReset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                calc.resetConsumption();
            }
        });

        return v;
    }

    public void updateText(String t){
        txtAlcLvl.setText(t);
    }

    public static SecondFragment newInstance(String text) {

        SecondFragment f = new SecondFragment();
        Bundle b = new Bundle();
        b.putString("msg", text);

        f.setArguments(b);

        return f;
    }
}
不要像活动调用新片段时通常期望的那样尝试“传递”值

public class MainActivity extends FragmentActivity {
  ...
  private float weight;

  public void setWeight(float weight) {
    this.weight = weight;
  }

  public float getWeight() {
    return this.weight();
  }

相反,考虑使用一些持久性存储来存储该值,例如SyrdPoopy或SQLite数据库。每个片段都可以根据需要从中读取和写入值。

您可以从头开始。 不要试图从片段中获取活动的权重,而是尝试从片段中设置活动的权重

public class MainActivity extends FragmentActivity {
  ...
  private float weight;

  public void setWeight(float weight) {
    this.weight = weight;
  }

  public float getWeight() {
    return this.weight();
  }
然后在你的第一个片段中:

((MainActivity)getActivity()).setWeight(...);
最后在你的第二个片段中:

float weight = ((MainActivity)getActivity()).getWeight();

这将是最简单的方法。使用持久性存储来传递int是过分的。首先感谢你的建议,我现在在我的应用程序中实现了这一点。但有一件事我还是不明白。当用户滑动屏幕时,我需要将EditText.getText传递给第二个片段,因为bevore无法在此EditText中输入任何内容。我如何才能做到这一点呢?我的答案之间的想法是,您不会将EditText.getText传递给第二个片段,但第二个片段会检索它。这可以通过在活动中调用getWeight方法在片段的onStart方法中完成。。。