Java Android Studio-MPAndroidChart将用户输入添加到折线图

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

嘿,伙计们,这是我第一次使用MPandroidChart,我目前正在试用它,以充分了解如何使用它及其功能。目前,我正在尝试使用用户输入的数据(通过片段)更新我的折线图。我已经看到了一些关于堆栈溢出的类似问题,但是它们似乎都不适合我

任何帮助都将不胜感激。提前谢谢

注意:这里有一些重复的代码,因为我正在试验并试图找出寻找解决方案的不同方法

获取用户输入的main片段

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