【问题标题】:How to Allow Shared Preferences Inside OnClick to Resolve to a Variable如何允许 OnClick 中的共享首选项解析为变量
【发布时间】:2014-05-24 00:21:14
【问题描述】:

我正在尝试通过单击操作栏上的项目来使用共享首选项保存文本。但是,字符串必须在应用的 OnCreate 中生成,否则会导致应用崩溃。但是您不能在 On Create 中放置方法,因此 onOptionItemSelected 或 OnClick 中的共享首选项无法在应用程序中找到字符串。我知道这听起来很令人困惑,所以如果您需要澄清,请询问。

这里是代码

    package com.bernard.beaconportal;

    import java.lang.reflect.Field;

   import com.actionbarsherlock.app.SherlockFragment;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.astuetz.PagerSlidingTabStrip;
import com.bernard.beaconportal.FragmentsLinked.ViewPagerAdapterScheduleView;

import android.view.View.OnClickListener;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

    public class FragmentsEdit extends FragmentActivity {

        private ViewPager pager;
        private ViewPagerAdapterSchedule adapter;
        private PagerSlidingTabStrip tabs;
        String uriString;






        @Override
            public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             getActionBar().setDisplayHomeAsUpEnabled(true);







             setContentView(R.layout.viewpager_schedule);

             pager = (ViewPager) findViewById(R.id.viewPager1);

             adapter = new ViewPagerAdapterSchedule(getSupportFragmentManager());

             tabs = (PagerSlidingTabStrip) findViewById(R.id.pagerTabStrip1);

             pager.setAdapter(adapter);

             tabs.setViewPager(pager);


             Intent intents = getIntent();

                String GFriday = intents.getStringExtra("G_Friday");
                String BFriday = intents.getStringExtra("B_Friday");
                String ADV1Friday = intents.getStringExtra("ADV1_Friday");
                String ADV2Friday = intents.getStringExtra("ADV2_Friday");
                String CFriday = intents.getStringExtra("C_Friday");
                String FFriday = intents.getStringExtra("F_Friday");







                Button button = (Button) findViewById(R.menu.android_apply);

                button.setOnClickListener(new OnClickListener() {
                            public void onClick(View view){


                                 SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("schedule",Context.MODE_PRIVATE);
                                    SharedPreferences.Editor editor = sharedPref.edit();
                                    editor.putString("G_Friday", GFriday);
                                    editor.putString("B_Friday", BFriday);
                                    editor.putString("ADV1_Friday", ADV1Friday);
                                    editor.putString("ADV2_Friday", ADV2Friday);
                                    editor.putString("C_Friday", CFriday);
                                    editor.putString("F_Friday", FFriday);
                                    editor.commit();

                            }


                        });


        }







         public class ViewPagerAdapterSchedule extends FragmentPagerAdapter {

                // Declare the number of ViewPager pages
                final int PAGE_COUNT = 5;
                private String titles[] = new String[] { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" };

                public ViewPagerAdapterSchedule(FragmentManager fm) {
                    super(fm);
                }

                @Override
                public Fragment getItem(int position) {
                    switch (position) {

                        // Open FragmentTab1.java
                    case 0:
                        Monday schedule_list_view = new Monday();
                        return schedule_list_view;

                        // Open FragmentTab2.java
                    case 1:
                        Tuesday schedule_list_view1 = new Tuesday();
                        return schedule_list_view1;

                    case 2:
                        Wednesday schedule_list_view2 = new Wednesday();
                        return schedule_list_view2;

                    case 3:
                        Thursday schedule_list_view3 = new Thursday();
                        return schedule_list_view3;

                    case 4:
                        Friday schedule_list_view4 = new Friday();
                        return schedule_list_view4;
                    }
                    return null;
                }

                public CharSequence getPageTitle(int position) {
                    return titles[position];
                }

                @Override
                public int getCount() {
                    return PAGE_COUNT;
                }




        }








    public boolean onCreateOptionsMenu(android.view.Menu menu) {

            android.view.MenuInflater inflater = getMenuInflater();
              inflater.inflate(R.menu.android_apply, menu);


           return super.onCreateOptionsMenu(menu);

    }

    @Override
           public boolean onOptionsItemSelected(android.view.MenuItem item) {
               // Handle presses on the action bar items
               switch (item.getItemId()) {
                   case R.id.apply:



                       Intent in = new Intent(this, MainActivity.class);
                       startActivity(in);

                       return true;
                   default:
                       return super.onOptionsItemSelected(item);


    }



    }



    }

在这里我尝试使用 OnOptionsItemSelected 完成所有操作

 package com.bernard.beaconportal;

    import java.lang.reflect.Field;

   import com.actionbarsherlock.app.SherlockFragment;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.astuetz.PagerSlidingTabStrip;
import com.bernard.beaconportal.FragmentsLinked.ViewPagerAdapterScheduleView;

import android.view.View.OnClickListener;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

    public class FragmentsEdit extends FragmentActivity {

        private ViewPager pager;
        private ViewPagerAdapterSchedule adapter;
        private PagerSlidingTabStrip tabs;
        String uriString;






        @Override
            public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             getActionBar().setDisplayHomeAsUpEnabled(true);







             setContentView(R.layout.viewpager_schedule);

             pager = (ViewPager) findViewById(R.id.viewPager1);

             adapter = new ViewPagerAdapterSchedule(getSupportFragmentManager());

             tabs = (PagerSlidingTabStrip) findViewById(R.id.pagerTabStrip1);

             pager.setAdapter(adapter);

             tabs.setViewPager(pager);


             Intent intents = getIntent();

                String GFriday = intents.getStringExtra("G_Friday");
                String BFriday = intents.getStringExtra("B_Friday");
                String ADV1Friday = intents.getStringExtra("ADV1_Friday");
                String ADV2Friday = intents.getStringExtra("ADV2_Friday");
                String CFriday = intents.getStringExtra("C_Friday");
                String FFriday = intents.getStringExtra("F_Friday");



        }







         public class ViewPagerAdapterSchedule extends FragmentPagerAdapter {

                // Declare the number of ViewPager pages
                final int PAGE_COUNT = 5;
                private String titles[] = new String[] { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" };

                public ViewPagerAdapterSchedule(FragmentManager fm) {
                    super(fm);
                }

                @Override
                public Fragment getItem(int position) {
                    switch (position) {

                        // Open FragmentTab1.java
                    case 0:
                        Monday schedule_list_view = new Monday();
                        return schedule_list_view;

                        // Open FragmentTab2.java
                    case 1:
                        Tuesday schedule_list_view1 = new Tuesday();
                        return schedule_list_view1;

                    case 2:
                        Wednesday schedule_list_view2 = new Wednesday();
                        return schedule_list_view2;

                    case 3:
                        Thursday schedule_list_view3 = new Thursday();
                        return schedule_list_view3;

                    case 4:
                        Friday schedule_list_view4 = new Friday();
                        return schedule_list_view4;
                    }
                    return null;
                }

                public CharSequence getPageTitle(int position) {
                    return titles[position];
                }

                @Override
                public int getCount() {
                    return PAGE_COUNT;
                }




        }








    public boolean onCreateOptionsMenu(android.view.Menu menu) {

            android.view.MenuInflater inflater = getMenuInflater();
              inflater.inflate(R.menu.android_apply, menu);


           return super.onCreateOptionsMenu(menu);

    }

    @Override
           public boolean onOptionsItemSelected(android.view.MenuItem item) {
               // Handle presses on the action bar items
               switch (item.getItemId()) {
                   case R.id.apply:

                       SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("schedule",Context.MODE_PRIVATE);
                        SharedPreferences.Editor editor = sharedPref.edit();
                        editor.putString("G_Friday", GFriday);
                        editor.putString("B_Friday", BFriday);
                        editor.putString("ADV1_Friday", ADV1Friday);
                        editor.putString("ADV2_Friday", ADV2Friday);
                        editor.putString("C_Friday", CFriday);
                        editor.putString("F_Friday", FFriday);
                        editor.commit();

                       Intent in = new Intent(this, MainActivity.class);
                       startActivity(in);

                       return true;
                   default:
                       return super.onOptionsItemSelected(item);


    }



    }



    }

【问题讨论】:

  • 只是一个注释,你的变量应该以小写字母开头,所以它们不会与类名混淆。
  • 不同,因为我使用了 OnOptionItemSelected,这意味着其中包含的内容无法看到 onCreate 中的字符串,即使它们是最终的。

标签: android string android-intent sharedpreferences oncreate


【解决方案1】:

你可以全局声明你的 String 变量,就像你对 uriString 所做的那样,像这样:

private String gFriday,bFriday,aDV1Friday,aDV2Friday, cFriday, fFriday;

然后,在onCreate() 中,你为它们赋予一个值,就像你已经在做的那样:

gFriday = intents.getStringExtra("G_Friday");
bFriday = intents.getStringExtra("B_Friday");
aADV1Friday = intents.getStringExtra("ADV1_Friday");
aDV2Friday = intents.getStringExtra("ADV2_Friday");
cFriday = intents.getStringExtra("C_Friday");
fFriday = intents.getStringExtra("F_Friday");

这样,你的作用域不限于onCreate() 方法,你可以从onOptionsItemSelected(). 内部访问你的字符串

【讨论】:

    【解决方案2】:

    我认为您要保存的 6 个字符串应该在一个数组中并声明为一个字段,并且键应该声明为常量(为了更简洁的代码并解决您的范围问题)。

    public class FragmentsEdit extends FragmentActivity {
        public static final String[] myKeys = { 
            "G_Friday", "B_Friday", "ADV1_Friday", 
            "ADV2_Friday", "C_Friday", "F_Friday" 
        };
        private List<String> myDayList;
    
        ...
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            getActionBar().setDisplayHomeAsUpEnabled(true);
    
            myDayList = new ArrayList<String>();
    
            Intent intent = getIntent();
    
            if (intent != null) // don't forget to test it
            {
                for ( String curKey : myKeys )
                    myDayList.add(intent.getStringExtra(curKey));
            }
    
            ....
        }
    

    现在您可以使用此方法将其保存在任何地方:

        public void savePref() {
            SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("schedule",Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPref.edit();
    
            int i = 0;
    
            for (String curStr : myDayList)
                if (i < myKeys.length) // to be sure we are not out of bound
                    editor.putString(myKeys[i++], curStr);
    
            editor.commit();
    
        }
    

    这应该可以解决问题。我没有测试过,所以可能有错误

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-28
      • 2022-07-04
      • 2019-05-20
      • 2019-04-23
      • 2022-10-03
      • 1970-01-01
      • 2014-08-17
      相关资源
      最近更新 更多