在片段中的onClick开关case语句中写入和读取文件

时间:2013-12-30 16:42:29

标签: android android-fragments

嘿伙计们,正如我上面所说,我在将onClick()方法内的Fragment方法内的switch-case语句中的文件写入手机的内部存储器时遇到问题。我知道这听起来很复杂。我想制作一个小计算器,可以告诉你需要多少升气体才能行驶100公里。

所以我想我会制作一个非常简单的,只有当这个人总是充满汽车的油箱才能工作,所以当他们第一次使用时他们必须给我公里的汽车和他们的坦克下次他们再次给我公里+他们需要多少升气体才能充满他们的坦克然后我想读出保存第一公里的文件并计算差异然后用驱动的公里来计算气体/ 100公里。

但我现在的问题是如何在switch-case语句中调用saveInInternalStorage()方法。

我希望你能帮助我。

所以这是Fragment

public class FragmentFuel extends Fragment implements OnClickListener{

  EditText kil;
  EditText fuel;
  Button calc;
  String filename;

  public static Fragment newInstance(Context context) {
        FragmentFuel f = new FragmentFuel();
        return f;
  }

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_fuel, null);
        Button b = (Button) root.findViewById(R.id.calcFirstTime);
        b.setOnClickListener(this);
  }

  @Override
  public void onClick(View v) {
        switch (v.getId()) {
              case R.id.calcFirstTime:
              saveInInternalStorage(v, getActivity());
              break;
        default:
              break;
        }
  }

  public void saveInInternalStorage (View view, Context fileContext){
        kil = (EditText) view.findViewById(R.id.kilometres);
        String dataToSave = kil.getText().toString();
        String FILENAME = "myFile";

    try {
              FileOutputStream fos = fileContext.openFileOutput(FILENAME, fileContext.MODE_PRIVATE);
              fos.write(dataToSave.getBytes());
              fos.close();
              Toast.makeText(fileContext,"Text Saved !",Toast.LENGTH_LONG).show();
    }
    catch (FileNotFoundException e) {
              e.printStackTrace();
              Toast.makeText(fileContext,"Error FileNotFound!",Toast.LENGTH_LONG).show();
    } catch (IOException e) {
              Toast.makeText(fileContext,"Error IOException!",Toast.LENGTH_LONG).show();
              e.printStackTrace();
        }
  }

}

好吧我稍微改造了我的片段以找到错误我对android很新,所以我真的不知道你在onCreate中实现视图的含义。 而NuLLPointer的提示也是正确的。错误是如果我给我的Edittext提供一些输入然后按下按钮以便它应该在Toast中显示整个应用程序崩溃。

public class FragmentFuel extends Fragment implements OnClickListener{

EditText kil;
EditText fuel;
Button calc;
Button calcFirstTime;
String filename;

public static Fragment newInstance(Context context) {
    FragmentFuel f = new FragmentFuel();
    return f;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_fuel,
            null);
    Button bu = (Button) root.findViewById(R.id.calcFuel);
    bu.setOnClickListener(this);

    Button b = (Button) root.findViewById(R.id.calcFirstTime);
    b.setOnClickListener(this);


    return root;

}



@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.calcFirstTime:
        anything(v);
        break;
    case R.id.calcFuel:
        //saveInInternalStorage(v, getActivity());
            Toast.makeText(getActivity(), "Error 2",Toast.LENGTH_LONG).show();
        break;

    default:
        break;
    }

}

public void anything(View view){

     kil = (EditText) view.findViewById(R.id.kilometres);
        String dataToSave = kil.getText().toString();
        Toast.makeText(getActivity(), dataToSave,Toast.LENGTH_LONG).show();
}

12-30 18:15:34.355:D / libEGL(6048):已加载/system/lib/egl/libGLES_android.so

12-30 18:15:34.365: D/libEGL(6048): loaded /system/lib/egl/libEGL_adreno200.so

12-30 18:15:34.375: D/libEGL(6048): loaded /system/lib/egl/libGLESv1_CM_adreno200.so

12-30 18:15:34.375: D/libEGL(6048): loaded /system/lib/egl/libGLESv2_adreno200.so

12-30 18:15:34.435: D/OpenGLRenderer(6048): Enabling debug mode 0

12-30 18:15:49.660: D/AndroidRuntime(6048): Shutting down VM

12-30 18:15:49.660: W/dalvikvm(6048): threadid=1: thread exiting with uncaught exception (group=0x40ab7228)
12-30 18:15:49.670: E/AndroidRuntime(6048): FATAL EXCEPTION: main

12-30 18:15:49.670: E/AndroidRuntime(6048): java.lang.NullPointerException

12-30 18:15:49.670: E/AndroidRuntime(6048):     at at.****.routelogbook.FragmentFuel.anything(FragmentFuel.java:92)

12-30 18:15:49.670: E/AndroidRuntime(6048):     at at.****.routelogbook.FragmentFuel.onClick(FragmentFuel.java:74)

12-30 18:15:49.670: E/AndroidRuntime(6048):     at android.view.View.performClick(View.java:3549)

12-30 18:15:49.670: E/AndroidRuntime(6048):     at android.view.View$PerformClick.run(View.java:14400)

12-30 18:15:49.670: E/AndroidRuntime(6048):     at android.os.Handler.handleCallback(Handler.java:605)

12-30 18:15:49.670: E/AndroidRuntime(6048):     at android.os.Handler.dispatchMessage(Handler.java:92)

12-30 18:15:49.670: E/AndroidRuntime(6048):     at android.os.Looper.loop(Looper.java:154)

12-30 18:15:49.670: E/AndroidRuntime(6048):     at android.app.ActivityThread.main(ActivityThread.java:4945)

12-30 18:15:49.670: E/AndroidRuntime(6048):     at java.lang.reflect.Method.invokeNative(Native Method)

12-30 18:15:49.670: E/AndroidRuntime(6048):     at java.lang.reflect.Method.invoke(Method.java:511)

12-30 18:15:49.670: E/AndroidRuntime(6048):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)

12-30 18:15:49.670: E/AndroidRuntime(6048):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)

12-30 18:15:49.670: E/AndroidRuntime(6048):     at dalvik.system.NativeStart.main(Native Method)

第92行是: String dataToSave = kil.getText().toString();

和第74行是在switch case语句中调用anything方法的地方

1 个答案:

答案 0 :(得分:1)

您需要在onCreateView

中返回一个视图
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
View root =  inflater.inflate(R.layout.fragment_fuel,
        container,null);

Button b = (Button) root.findViewById(R.id.calcFirstTime);
b.setOnClickListener(this);
return root; // missing

}

我进一步怀疑是NullPointerException。发布堆栈跟踪

我猜第92行是

String dataToSave = kil.getText().toString();

kil为空

我建议

EditText ed;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View root =  inflater.inflate(R.layout.fragment_fuel,
            container,null);
    ed = (EditText) rootview.findViewById(R.id.kilometres);
    Button b = (Button) root.findViewById(R.id.calcFirstTime);
    b.setOnClickListener(this);
    return root; 
    }

然后

 anything();

然后

public void anything(){
    String dataToSave = ed.getText().toString();
    Toast.makeText(getActivity(), dataToSave,Toast.LENGTH_LONG).show();
}