我想使用“活动引用”将数据传递给活动以进行分段:
代码如下:在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提到的一样。
答案 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.");
}
如果运行代码,则将根据需要获得输出。