将长整型值从一个片段通过主活动传递到另一个片段



我有一个包含两个片段的main_activity。当在 beatTimeFragment 上单击按钮时,我希望 beatTimeFragment 确定按下按钮的 1970 年之后的毫秒,并通过主要活动将其传递给 toneTimeFragment。然后,toneTimeFragment 会将响应与标准节拍进行比较并给出偏移量。

我看到的每个示例都传递字符串数据而不是长数据。在我的代码中,我尝试传递字符串数据,然后将其转换为长数据。字符串数据被传输(我可以显示字符串)。但是长整型给出的响应为 0,或者如果我没有例外,它会把我踢出去。

有没有办法让转换工作,或者如果没有,我如何通过删除

beatTimeDisplay.getText().toString()

在节拍时间片段的结尾?

main_activity

public class MainActivity extends AppCompatActivity implements 
BeatTimeFragment.BeatTimeListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//Get called by BeatTimeFragment when button is pushed
@Override
public void sendBeatData(String beatTime) {
ToneTimeFragment toneFragment = (ToneTimeFragment) getSupportFragmentManager().findFragmentById(R.id.fragment);
toneFragment.setBeatLong(beatTime);
}
}

音调时间片段

public class ToneTimeFragment extends Fragment {

public void setBeatLong(String beatTime) {
try {
beatTimeL = Long.parseLong(beatTime);
} catch (NumberFormatException e) {
System.out.println("NumberFormatException: " + e.getMessage());
}
// beatTimeL = Long.parseLong(beatTime);
offSet = beatTimeL - toneTime;
offSetView.setText(beatTime + " msec");

节拍时间片段

public class BeatTimeFragment extends Fragment {
private static Button beatBtn;
private static TextView beatTimeDisplay;
int q = 0;
long beatTime = 0;
//set up sending beatTime
BeatTimeListener activityCommander;
public interface BeatTimeListener{
public void sendBeatData(String beatTime);
}
//setup to send data to top
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
activityCommander = (BeatTimeListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString());
}
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.beat_time_fragment, container, false);
beatTimeDisplay = (TextView) view.findViewById(R.id.beatTimeDisplay);
final Button beatBtn = (Button) view.findViewById(R.id.beatBtn);

beatBtn.setOnClickListener(
new View.OnClickListener() {
public void onClick(View v){
long beatTime= System.currentTimeMillis();
TextView view1 = (TextView) view.findViewById(R.id.beatTimeDisplay);
view1.setText(beatTime + " msec");
readySendBeat(v);
}
}
);
return view;
}
//calls to send data when button clicked
public void readySendBeat(View v) {
activityCommander.sendBeatData(beatTimeDisplay.getText().toString());
}
}

在调试时,我意识到我没有将我的 beatTime 值传递到 BeatTimeFragment 中的 readySendBeat 方法中。当我将对象添加到方法中时,我能够传递数据并且不再获得值 0。

public void readySendBeat(Long beatTime){
activityCommander.sendBeatData(beatTime);
}

试试这个,你不需要调用按钮侦听器中的 findViewById,也不需要创建重复的长字段:

主要活动:

public class MainActivity extends AppCompatActivity implements 
BeatTimeFragment.BeatTimeListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//Get called by BeatTimeFragment when button is pushed
@Override
public void sendBeatData(long beatTime) {
ToneTimeFragment toneFragment = (ToneTimeFragment) getSupportFragmentManager().findFragmentById(R.id.fragment);
toneFragment.setBeatLong(beatTime);
}
}

音调时间片段:

public class ToneTimeFragment extends Fragment {
public void setBeatLong(long beatTime) {
try {
beatTimeL = beatTime;
} catch (NumberFormatException e) {
System.out.println("NumberFormatException: " + e.getMessage());
}
offSet = beatTimeL - toneTime;
offSetView.setText(beatTime + " msec");

BeatTimeFragment:

public class BeatTimeFragment extends Fragment {
private static Button beatBtn;
private static TextView beatTimeDisplay;
int q = 0;
long beatTime = 0;
//set up sending beatTime
BeatTimeListener activityCommander;
public interface BeatTimeListener{
public void sendBeatData(String beatTime);
}
//setup to send data to top
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
activityCommander = (BeatTimeListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString());
}
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.beat_time_fragment, container, false);
beatTimeDisplay = (TextView) view.findViewById(R.id.beatTimeDisplay);
final Button beatBtn = (Button) view.findViewById(R.id.beatBtn);

beatBtn.setOnClickListener(
new View.OnClickListener() {
public void onClick(View v){
beatTime= System.currentTimeMillis();
beatTimeDisplay.setText(beatTime + " msec");
readySendBeat(v);
}
}
);
return view;
}
//calls to send data when button clicked
public void readySendBeat() {
activityCommander.sendBeatData(beatTime);
}
}

最新更新