Java Android Studio-MPAndroidChart将用户输入添加到折线图
嘿,伙计们,这是我第一次使用MPandroidChart,我目前正在试用它,以充分了解如何使用它及其功能。目前,我正在尝试使用用户输入的数据(通过片段)更新我的折线图。我已经看到了一些关于堆栈溢出的类似问题,但是它们似乎都不适合我 任何帮助都将不胜感激。提前谢谢 注意:这里有一些重复的代码,因为我正在试验并试图找出寻找解决方案的不同方法 获取用户输入的main片段Java Android Studio-MPAndroidChart将用户输入添加到折线图,java,android,android-studio,user-input,mpandroidchart,Java,Android,Android Studio,User Input,Mpandroidchart,嘿,伙计们,这是我第一次使用MPandroidChart,我目前正在试用它,以充分了解如何使用它及其功能。目前,我正在尝试使用用户输入的数据(通过片段)更新我的折线图。我已经看到了一些关于堆栈溢出的类似问题,但是它们似乎都不适合我 任何帮助都将不胜感激。提前谢谢 注意:这里有一些重复的代码,因为我正在试验并试图找出寻找解决方案的不同方法 获取用户输入的main片段 public class Fragment1 extends Fragment { EditText Input; Button
public class Fragment1 extends Fragment {
EditText Input;
Button EnterVal;
public float userInput;
//Fragment1Listener activityCommander;
public interface Fragment1Listener{
void sendInput(float value);
}
/*@Override
public void onAttach(Context context) {
super.onAttach(context);
try{
activityCommander = (Fragment1Listener) getTargetFragment();
}catch (ClassCastException e){
throw new ClassCastException(context.toString() + "Must Implement FragmentListener");
}
}*/
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment1, container, false);
//@SuppressWarnings("all")
Input = view.findViewById(R.id.Input);
EnterVal = view.findViewById(R.id.button);
EnterVal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String val = Input.getText().toString();
if(val != null && val.length() > 0) {
userInput = Float.valueOf(val);
Input.setText("");
/*if(activityCommander != null) {
activityCommander.sendInput(userInput);
}*/
Fragment1Listener listener = getListener();
if(listener != null){
listener.sendInput(userInput);
Log.d("User Val", "Listener was successfull!");
}
}
}
});
return view;
}
@Nullable
private Fragment1Listener getListener(){
Fragment1Listener activityCommander;
try{
Fragment onInputSelected_Frag = getTargetFragment();
if(onInputSelected_Frag != null){
activityCommander = (Fragment1Listener) onInputSelected_Frag;
}
else{
Activity onInputSelected_Act = getActivity();
activityCommander = (Fragment1Listener) onInputSelected_Act;
}
return activityCommander;
}catch(ClassCastException e){
Log.e("Fragment Listener", "getListener: ClassCastException + " + e.getMessage());
}
return null;
}
}
MPandroidchart片段(折线图)
您可以更直接地设置侦听器。尝试将此方法添加到
Fragment1
(并删除getListener
)
然后在活动中设置侦听器,如下所示
private void setupViewPager(ViewPager viewPager){
SectionsPagerAdapter adapter = new SectionsPagerAdapter(getSupportFragmentManager());
Fragment1 f1 = new Fragment1();
Fragment2 f2 = new Fragment2();
f1.setListener(f2);
adapter.addFragment(f1, "Fragment 1");
adapter.addFragment(f2, "Fragment 2");
viewPager.setAdapter(adapter);
}
当屏幕旋转时,这种方法可能会有问题,但这至少会让你克服这个障碍。如果要继续使用getTargetFragment
方法,还需要在某个地方调用setTargetFragment
(参见此)。类似于f1.setTargetFragment(f2)代码>而不是上面代码中的f1.setListener(f2)
我认为,一旦侦听器开始工作,您需要对图形部分进行一些更改,以使其保持工作状态。例如,替换
lineChart.setData(new LineData(lineDataSets));
lineChart.setData(new LineData()); // this overrides the previous line with an empty data set
与
但这至少会让你走上正确的道路。你能再描述一下你目前的方法不起作用的原因吗?它似乎根本无法更新图表。没有任何用户输入被输入到图形中。您是否验证(在调试器中或仅使用日志/打印语句)Fragment2中的sendInput
方法是否被调用?只要看一下代码,它看起来像xSet
应该是空的,因为您在带有lineChart.setData(newlinedata())的图表上放置了一个空行数据对象
没错,sendInput
根本不会被调用。为什么呢?当我通过这个代码按下Fragment1中的按钮时,它不应该立即被调用吗如果activityCommand
为空,则代码>不可用。添加一些调试语句以检查它是否在onAttach
中正确设置且不为空。如果getTargetFragment()
返回null,则可能为null(您可以将null强制转换为任何内容,因此不会抛出任何ClassCastException
)。如果您将活动代码发布到启动片段并建立其关联的位置,也可能会有所帮助。嘿,谢谢Tyler,FragmentListener终于开始工作了!但是我想知道为什么您要在主活动中设置侦听器以使其工作,而不是在片段本身中?如果您指的是f1.setListener(f2)
命令,那么您必须在两个片段都可用的地方设置侦听器(这样你就可以告诉Fragment1的实例,它的侦听器是Fragment2的一个特定实例)。否则,你的Fragment1实例不知道Fragment2的任何实例的存在。你必须让他们在同一个房间里一起介绍他们,并且创建他们的活动是一个自然的地方。
void setListener(Fragment1Listener listener) {
activityCommander = listener;
}
private void setupViewPager(ViewPager viewPager){
SectionsPagerAdapter adapter = new SectionsPagerAdapter(getSupportFragmentManager());
Fragment1 f1 = new Fragment1();
Fragment2 f2 = new Fragment2();
f1.setListener(f2);
adapter.addFragment(f1, "Fragment 1");
adapter.addFragment(f2, "Fragment 2");
viewPager.setAdapter(adapter);
}
lineChart.setData(new LineData(lineDataSets));
lineChart.setData(new LineData()); // this overrides the previous line with an empty data set
data.addDataSet([... the sets you want to add ...]);
lineChart.setData(data);