没有从活动中获得价值

时间:2019-01-28 11:29:25

标签: android android-fragments

我想使用“活动引用”将数据传递给活动以进行分段:

代码如下:在MainActiivty

public Integer i = 0; 

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 thread = new Thread() {
            @Override
            public void run() {
                try {
                    while (!thread.isInterrupted()) {
                        Thread.sleep(1000);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                i++;
                            }
                        });
                    }
                } catch (InterruptedException e) {
                }
            }
        };
        thread.start();
}

在片段中:

MainActivity ma=new MainActivity();
mySpeed = String.valueOf(ma.i);

问题是我的值保持为0,我无法获取我的更新值

如果我将i存储到另一个Globe变量(j)中,又在片段中

  MainActivity ma=new MainActivity();
   mySpeed = String.valueOf(ma.j);

然后我遇到错误

java.lang.NumberFormatException: For input string: "null"
        at java.lang.Integer.parseInt(Integer.java:521)
        at java.lang.Integer.valueOf(Integer.java:611)

整个片段的代码

 public class SpeedFragment extends Fragment {

        View view;
        TextView SpeedFrgvalue;
        DigitSpeedView DigitrpmFrgView;
        SpeedView speedometer;

        Button DigitalView,Gaugeview;
        LinearLayout linearLayoutspeed;

        String mySpeed;

        private int myInteger;

        Thread thread;

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

        @RequiresApi(api = Build.VERSION_CODES.M)
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            Bundle bundle = this.getArguments();
            mySpeed = bundle.getString("speed");
                  Toast.makeText(getContext(),mySpeed,Toast.LENGTH_SHORT).show();

        }

        public void setMyInteger(int i) {
            this.myInteger = i;
        }

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

            // Inflate the layout for this fragment
            view=inflater.inflate(R.layout.fragment_speed, container, false);
            SpeedFrgvalue=(TextView)view.findViewById(R.id.speedfrgvalue);
            speedometer=(SpeedView)view.findViewById(R.id.speedViewfrag);
            Gaugeview=(Button)view.findViewById(R.id.Gaugeviewid);
            DigitalView=(Button)view.findViewById(R.id.digitalviewid);


            SpeedFrgvalue.setText(String.valueOf(myInteger));
            linearLayoutspeed=(LinearLayout)view.findViewById(R.id.digitalspeedlinaear);
            DigitrpmFrgView=(DigitSpeedView)view.findViewById(R.id.digitalSpeedfrgid);
            DigitrpmFrgView.updateSpeed((myInteger));


            speedometer.setMaxSpeed(250);
    //        speedometer.speedTo(Integer.valueOf(mySpeed),4000);

            return view;

        }
    }

在MainActiivty的Oncreate内部,我正在调用setMyInteger;。和yusaf提到的一样。

3 个答案:

答案 0 :(得分:1)

MainActivity ma=new MainActivity();

您不应实例化这样的活动。

如果要将活动中的整数值传递给片段,可以采用多种方法。

实现此目的的一种方法如下

  • 在片段中定义一个整数成员变量

    private int myInteger;
    
  • 为片段中的整数变量定义一个公共的setter方法

    public void setMyInteger(int i) {
       this.myInteger = i;
    }
    
  • 在活动中,实例化该片段并通过setter方法设置片段中整数变量的值

    MyFragment frag = new MyFragment();
    frag.setMyInteger(10);
    

还有其他方法可以实现这一目标,请参见Send data from activity to fragment in android

答案 1 :(得分:0)

您必须将数据打包发送,然后需要在片段中提取该数据。

Bundle bundle = new Bundle();
bundle.putString("key", "value");
// make object of your fragment and set arguments to pass
Fragmentclass object = new Fragmentclass();
object.setArguments(bundle);

然后在您的片段类中

 String text = getArguments().getString("key");

您将从中获取文本值。

答案 2 :(得分:0)

我想我们需要注意的第一件事是在创建片段时,否则我们可能会得到空指针错误。因此,我将片段附加到MainActivity的onCreate的activity_main内。

FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    Frag1 fragment = new Frag1();
    fragmentTransaction.replace(R.id.ll, fragment);
    fragmentTransaction.commit();

接下来,我在此之后使用按钮单击方法运行线程。

public void run(View view){
    t = new Thread(this, "Demo Thread");
    System.out.println("Child thread: " + t);
    t.start(); // Start the thread
}

如果在片段事务之后将以上三行包含在onCreate内,则会出现空指针错误。接下来是棘手的部分,线程将在一段时间内生成新值,但其余代码已运行。因此,这就是您获得零(初始值)的原因。 (据我所知)可以通过创建Intent或通过创建Listener技术上解决此问题。我试图使用Intent,但是不幸的是,当Intent从Fragment变为MainActivity(或任何其他活动)时,我无法完成从Activity到Fragment的工作(可能仍然缺少某些东西)。所以我用了监听器。现在没有现成的侦听器,我们必须创建一个侦听器。更棘手的是如何使用它。我创建了一个接口OnFragmentInteractionListener.java来做到这一点。

interface OnFragmentInteractionListener {
    void onFragmentInteraction(int i);}

现在在Fragment中,我想在TextView中显示它。为此,我将在onStart()方法内创建视图(否则会出现空指针错误:-)。我将实例化其中的接口。

Activity context;
TextView tv;
static OnFragmentInteractionListener onFragmentInteractionListener;
@Override
public void onStart() {
    super.onStart();
    context = getActivity();
    tv = context.findViewById(R.id.output)   ;
    onFragmentInteractionListener = new OnFragmentInteractionListener() {
        @Override
        public void onFragmentInteraction(int i) {
        tv.setText(" OUT "+i);
        }
    };
}

接下来回到MainActivity。

@Override
public void run() {
    try {
        for(int i = 20; i > 0; i--) {
            System.out.println("Child Thread: " + i);
            Frag1.onFragmentInteractionListener.onFragmentInteraction(i);
            Thread.sleep(2000);
        }
    } catch (InterruptedException e) {
        System.out.println("Child interrupted.");
    }
    System.out.println("Exiting child thread.");
}

如果运行代码,则将根据需要获得输出。