共享首选项值更改时视图不更新
Posted
技术标签:
【中文标题】共享首选项值更改时视图不更新【英文标题】:View not updating when shared preferences value is changed 【发布时间】:2019-10-07 23:32:01 【问题描述】:我正在使用共享首选项来保存用户项目点击,然后在 2 次点击后显示 admob 广告一切正常,但我的问题是当我点击一个项目 2-3 次时,该值被保存到共享首选项但是广告没有显示,我必须退出我的应用程序然后才会显示广告。
我在 google 和 *** 上搜索过,但没有任何帮助。
附:项目点击启动另一个活动
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
rvWord = findViewById(R.id.recyclerview);
rvWord.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
mDBHelper = new DatabaseHelper(this);
mAdView = findViewById(R.id.adView);
dictionaryAdapter = new DictionaryAdapter(this);
dictionaryAdapter.setCursor(mDBHelper.getDictionaryWord(""));
rvWord.setAdapter(dictionaryAdapter);
mInterstitialAd = new InterstitialAd(this);
mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712");
mInterstitialAd.loadAd(new AdRequest.Builder().build());
preferences = getSharedPreferences("click_count",MODE_PRIVATE);
if ( preferences.getInt("count", 0) > 2)
mInterstitialAd.setAdListener(new AdListener()
public void onAdLoaded()
if (mInterstitialAd.isLoaded())
mInterstitialAd.show();
);
editor = preferences.edit();
editor.clear();
editor.apply();
// Show Notification Daily
showTimedNotification(this);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
【问题讨论】:
【参考方案1】:我有同样的问题,但是当我使用 commit() 而不是 apply() 时。它可能工作正常。
因为 apply() 是异步的,所以它提交时不返回指示成功或失败的布尔值。
commit() 是同步的,如果保存成功则返回 true,否则返回 false。
【讨论】:
【参考方案2】:问题可能是广告未加载显示。根据docs,您必须在 onCreate 方法中加载广告。
将下面的行移至您的 onCreate 方法
mInterstitialAd = new InterstitialAd(this);
mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712");
mInterstitialAd.loadAd(new AdRequest.Builder().build());
并在插页式广告关闭时加载新广告,以便下次单击按钮时可以显示此已加载的广告。使用以下代码更新 AdListener。如果需要在返回时检查首选项值,则必须在 onStart 方法中使用它,因为只有在应用程序重新启动时才会调用 onCreate 方法。阅读此doc 以了解 android 活动生命周期
@Override
protected void onStart()
super.onStart();
if ( preferences.getInt("count", 0) > 2)
mInterstitialAd.setAdListener(new AdListener()
public void onAdLoaded()
if (mInterstitialAd.isLoaded())
mInterstitialAd.show();
@Override
public void onAdClosed()
// Load the next interstitial.
mInterstitialAd.loadAd(new AdRequest.Builder().build());
);
editor = preferences.edit();
editor.clear();
editor.apply();
【讨论】:
我更新了我的代码。您必须在 if 条件内移动editor.clear();
。否则,在计数大于 2 之前,该值被清除。希望这能解决问题
尝试在if ( preferences.getInt("count", 0) > 2)
调试您的代码,检查问题出在广告上还是计数上。即检查if条件是否正常
问题是当我从详细活动导航返回时,if 语句没有在我的主要活动中执行,为了好奇,我试图将相同的代码放在我的视图持有者适配器中,并且效果很好
你在哪里有这个代码?能发下完整代码吗
更新了我的答案。希望这将有助于解决问题以上是关于共享首选项值更改时视图不更新的主要内容,如果未能解决你的问题,请参考以下文章