[英]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.