简体   繁体   English

没有从活动中获得价值

[英]Not getting value in fragment from activity

I want to pass data to activity to fragment with use of Reference of Activity : 我想使用Activity的引用将数据传递给Activity进行分段:

code as below:In MainActiivty 代码如下:在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();
}

In Fragment: 在片段中:

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

Problem is value of i remain 0 , i can't get updated value of i 问题是我的值保持为0,我无法获取我的更新值

if I Store i into another Globe variable (j) and In fragment 如果我将我存储到另一个Globe变量(j)和片段中

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

then i got Error 然后我得到了错误

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

whole code of Fragment 片段的完整代码

 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;

        }
    }

Inside Oncreate of MainActiivty I am calling setMyInteger; 在MainActiivty的Oncreate内部,我叫setMyInteger; Same as mention by yusaf. 与yusaf提到的相同。

MainActivity ma=new MainActivity();

You shouldn't instantiate your activities like this. 您不应该像这样实例化您的活动。

If you want to pass an integer value from an activity to fragment, there are multiple ways to do this. 如果要将活动中的整数值传递给片段,可以采用多种方法。

One way to achieve this is as follows 实现此目的的一种方法如下

  • Define an integer member variable in fragment 在片段中定义一个整数成员变量

     private int myInteger; 
  • Define a public setter method for that integer variable in fragment 为片段中的该整数变量定义公共设置方法

     public void setMyInteger(int i) { this.myInteger = i; } 
  • Inside activity, instantiate that fragment and set the value of the integer variable in fragment via setter method 在活动内部,实例化该片段并通过setter方法设置片段中整数变量的值

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

There are others ways to achieve this, see Send data from activity to fragment in android 还有其他方法可以实现此目的,请参阅在Android中将数据从活动发送到片段

You have to send your data in a bundle and then you need to fetch that data in your fragment. 您必须成束发送数据,然后需要在片段中获取该数据。

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);

Then in your fragment class 然后在您的片段类中

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

And you will get the value in text from this. 这样您将获得文本中的值。

The first thing I guess we need to take care is that when we are creating the fragment, otherwise we may get a null pointer error. 我想我们需要注意的第一件事是在创建片段时,否则我们可能会得到空指针错误。 So I attached the fragment inside activity_main in onCreate in MainActivity. 因此,我在MainActivity的onCreate的activity_main内附加了片段。

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

Next I run the thread after this using a button click method. 接下来,在此之后,我使用按钮单击方法运行线程。

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

If I include the above three lines inside onCreate after fragment transaction I get a null pointer error. 如果在片段事务处理后将以上三行包含在onCreate内,则会出现空指针错误。 Next comes the tricky part the thread will generate new values over a time but rest of the code already ran. 接下来是棘手的部分,线程将在一段时间内生成新值,但其余代码已运行。 So that is the reason you are getting zero (initial value). 因此,这就是您获得零(初始值)的原因。 This can be solved technically(to my knowledge) either by creating an Intent or by creating a Listener. (据我所知)可以通过创建Intent或通过创建Listener技术上解决此问题。 I tried to use Intent, unfortunately while Intent goes from Fragment to MainActivity(or any other activity) I could not get it done from Activity to fragment (probably still missing something). 我试图使用Intent,但是不幸的是,当Intent从Fragment变为MainActivity(或任何其他活动)时,我无法完成从Activity到Fragment的工作(可能仍然缺少某些东西)。 So I used Listener. 所以我用了监听器。 Now there is no ready made listener, we have to create a one. 现在没有现成的侦听器,我们必须创建一个侦听器。 More trickier is how to use that. 更棘手的是如何使用它。 I created an interface OnFragmentInteractionListener.java to do that. 我创建了一个接口OnFragmentInteractionListener.java来做到这一点。

interface OnFragmentInteractionListener {
    void onFragmentInteraction(int i);}

Now inside Fragment I want to display this in a TextView. 现在在Fragment中,我想在TextView中显示它。 For that I would create views inside onStart() method (otherwise I get a null pointer error :-). 为此,我将在onStart()方法内创建视图(否则会出现空指针错误:-)。 And I will Instantiate the interface inside it. 我将实例化其中的接口。

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);
        }
    };
}

Next coming back to MainActivity. 接下来回到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.");
}

If you run the code you will get the output as you wanted. 如果运行代码,则将根据需要获得输出。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM