从碎片中保存内部存储中的数据?

时间:2014-02-28 11:34:19

标签: android eclipse android-fragments

确定。我使用导航抽屉完成了一个应用程序,列表上的每个项目都会打开一个新活动。 我总是讨厌片段,但现在我认为片段是我需要的。我想使用Fragments而不是制作新的Activity。但是出现了问题。

我无法将数据保存在碎片的内部存储中。在活动中,这不是问题。我不知道为什么?即使吐司也不行。有什么想法吗?

public class PagesFragment extends Fragment implements OnClickListener{

        public PagesFragment(){}
        Button save;
        EditText filename, entry, pass;
        String FILENAME, JOUR, PASSWORD;
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {

            View rootView = inflater.inflate(R.layout.fragment_pages, container, false);
            save = (Button) getActivity().findViewById(R.id.b5);

            filename = (EditText) getActivity().findViewById(R.id.editText3);
            entry = (EditText) getActivity().findViewById(R.id.editText1);
            pass = (EditText) getActivity().findViewById(R.id.editText2);


            return rootView;    

        }

        @Override
        public void onClick(View arg0) {

            // TODO Auto-generated method stub
            FILENAME = filename.getText().toString();

            JOUR = entry.getText().toString();

            PASSWORD = pass.getText().toString();

            if (PASSWORD.contentEquals("") || JOUR.contentEquals("")
                    || FILENAME.contentEquals("")) {

                Toast.makeText(getApplicationContext(), "All field required.",
                        Toast.LENGTH_SHORT).show();
            } else {

                String usernametext = "Username:\n";
                String passwordtext = "Password:\n";
                String space = "\n";

                try {
                    FileOutputStream fos = openFileOutput(FILENAME,
                            Context.MODE_PRIVATE);
                    fos.write(usernametext.getBytes());
                    fos.write(JOUR.getBytes());
                    fos.write(space.getBytes());
                    fos.write(passwordtext.getBytes());
                    fos.write(PASSWORD.getBytes());
                    fos.close();
                    Toast.makeText(getApplicationContext(),
                            "Your Credentials are saved.", Toast.LENGTH_SHORT)
                            .show();




                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }
    }

我在吐司上遇到问题。它说方法getApplicationContext()未定义为PagesFragment类型(这是一个类),而openFileOutPut也是同样的问题。

我在这个网站上看到了解决方案,但我的问题是,如果摆脱所有错误也无法正常工作。我点击按钮,没有任何反应。没有显示toast,也没有保存数据。

我只是想看看点击按钮是否会显示吐司,所以我评论了所有内容,然后就在那里留下了吐司。但是,当我点击按钮时,它甚至没有显示吐司。我的意思是onClick甚至没有工作。

PS。如果有人知道有关保存和从不同片段检索数据的任何教程,请将链接放在下面。那会非常有帮助。感谢。

logcat的:

02-28 12:46:43.957: E/AndroidRuntime(9022): FATAL EXCEPTION: main
02-28 12:46:43.957: E/AndroidRuntime(9022): java.lang.NullPointerException
02-28 12:46:43.957: E/AndroidRuntime(9022):     at info.androidhive.slidingmenu.PagesFragment.onCreateView(PagesFragment.java:32)
02-28 12:46:43.957: E/AndroidRuntime(9022):     at android.app.Fragment.performCreateView(Fragment.java:1695)
02-28 12:46:43.957: E/AndroidRuntime(9022):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)
02-28 12:46:43.957: E/AndroidRuntime(9022):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)
02-28 12:46:43.957: E/AndroidRuntime(9022):     at android.app.BackStackRecord.run(BackStackRecord.java:682)
02-28 12:46:43.957: E/AndroidRuntime(9022):     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)
02-28 12:46:43.957: E/AndroidRuntime(9022):     at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441)
02-28 12:46:43.957: E/AndroidRuntime(9022):     at android.os.Handler.handleCallback(Handler.java:730)
02-28 12:46:43.957: E/AndroidRuntime(9022):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-28 12:46:43.957: E/AndroidRuntime(9022):     at android.os.Looper.loop(Looper.java:137)
02-28 12:46:43.957: E/AndroidRuntime(9022):     at android.app.ActivityThread.main(ActivityThread.java:5290)
02-28 12:46:43.957: E/AndroidRuntime(9022):     at java.lang.reflect.Method.invokeNative(Native Method)
02-28 12:46:43.957: E/AndroidRuntime(9022):     at java.lang.reflect.Method.invoke(Method.java:525)
02-28 12:46:43.957: E/AndroidRuntime(9022):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
02-28 12:46:43.957: E/AndroidRuntime(9022):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
02-28 12:46:43.957: E/AndroidRuntime(9022):     at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:1)

Finnaly解决了这个问题。

            save = (Button) getActivity().findViewById(R.id.b5);
            filename = (EditText) getActivity().findViewById(R.id.editText3);
            entry = (EditText) getActivity().findViewById(R.id.editText1);
            pass = (EditText) getActivity().findViewById(R.id.editText2);

在这一行中,由于函数返回getActivity(),我将rootView替换为rootView

我还添加了

save.setOnClickListener(this);

在这一行

 FileOutputStream fos = openFileOutput(FILENAME,
                            Context.MODE_PRIVATE);

我添加了getActivity(),所以它变成了,

FileOutputStream fos = getActivity().openFileOutput(FILENAME,
                        Context.MODE_PRIVATE);

现在有效。感谢@Shrikant的回答。

答案 1 :(得分:0)

尝试使用getActivity()片段来显示toast,而不是getApplicationContext。 对于按钮单击,请使用btn.setOnClickListener(this)。