簡體   English   中英

沒有從活動中獲得價值

[英]Not getting value in fragment from activity

我想使用Activity的引用將數據傳遞給Activity進行分段:

代碼如下:在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,我無法獲取我的更新值

如果我將我存儲到另一個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提到的相同。

MainActivity ma=new MainActivity();

您不應該像這樣實例化您的活動。

如果要將活動中的整數值傳遞給片段,可以采用多種方法。

實現此目的的一種方法如下

  • 在片段中定義一個整數成員變量

     private int myInteger; 
  • 為片段中的該整數變量定義公共設置方法

     public void setMyInteger(int i) { this.myInteger = i; } 
  • 在活動內部,實例化該片段並通過setter方法設置片段中整數變量的值

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

還有其他方法可以實現此目的,請參閱在Android中將數據從活動發送到片段

您必須成束發送數據,然后需要在片段中獲取該數據。

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

這樣您將獲得文本中的值。

我想我們需要注意的第一件事是在創建片段時,否則我們可能會得到空指針錯誤。 因此,我在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.");
}

如果運行代碼,則將根據需要獲得輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM