折腾:
【未解决】Android Studio中gradle编译rcjsta项目多个使用或覆盖了已过时的API等报错
期间,继续解决其他错误:
rcsjta/samples/api/tts/src/com/orangelabs/rcs/tts/Main.java:62: 警告: [deprecation] PreferenceActivity中的addPreferencesFromResource(int)已过时 addPreferencesFromResource(R.xml.tts_preferences); ^
代码是:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); askPermissions(); // Set title setTitle(R.string.app_title); // Set preferences addPreferencesFromResource(R.xml.tts_preferences); activateCheck = (CheckBoxPreference) getPreferenceScreen().findPreference("activate"); activateCheck.setOnPreferenceChangeListener(this); }
中的:
addPreferencesFromResource(R.xml.tts_preferences);
去看定义
android/preference/PreferenceActivity.java
/** * Inflates the given XML resource and adds the preference hierarchy to the current * preference hierarchy. * * @param preferencesResId The XML resource ID to inflate. * * @deprecated This function is not relevant for a modern fragment-based * PreferenceActivity. */ @Deprecated public void addPreferencesFromResource(int preferencesResId) { requirePreferenceManager(); setPreferenceScreen(mPreferenceManager.inflateFromResource(this, preferencesResId, getPreferenceScreen())); }
果然标记了已废弃
deprecation PreferenceActivity中的addPreferencesFromResource int
有关PreferenceActivity的Android弃用方法警告 – Thinbug
sharedpreferences – Android- deprecated method warning regarding PreferenceActivity – Stack Overflow
解释了,之所以描述中没给出替换的备用方法,是因为整个思路变了:
推荐换用
-》不过此时 20200807此页面,也提示了:
This class was deprecated in API level 28.
API=28时,又会废弃此,对于之前来说新的方式
建议:
Use the AndroidX Preference Library for consistent behavior across all devices. For more information on using the AndroidX Preference Library see Settings.
相关内容:
”在项目中使用 androidx 库
如需了解如何迁移现有项目,请参阅迁移到 AndroidX。
如果要在新项目中使用命名空间为 androidx 的库,则需要将编译 SDK 设置为 Android 9.0(API 级别 28)或更高版本,并在 gradle.properties 文件中将以下两个 Android Gradle 插件标记设置为 true。
* android.useAndroidX:该标记设置为 true 时,Android 插件会使用对应的 AndroidX 库,而非支持库。如果未指定,则该标记默认为 false。
* android.enableJetifier:该标记设置为 true 时,Android 插件会通过重写其二进制文件来自动迁移现有的第三方库,以使用 AndroidX 依赖项。如果未指定,该标记默认为 false。”
->不过,此处不想这么轻易改动api的版本=sdk的版本
因为影响估计会很大
会导致其他代码,可能都要修改
项目不是自己写的,且代码量很大,所以不能轻易改
androidx.preference | Android 开发者 | Android Developers
PreferenceActivity已废弃,但是现在可以用PreferenceFragment
和:PreferenceFragmentCompat
点赞最多的也是和前面说的一样
建议用
而此时20200806,此页面也提示:
This class was deprecated in API level 29. Use the AndroidX Preference Library for consistent behavior across all devices. For more information on using the AndroidX Preference Library see Settings.
不过感觉,还是可以暂时用用的。
android 3.0+建议用:PreferenceFragment
参考代码
但是都是9年前的,放弃。
有最新几年的代码,还算值得参考
PreferenceActivity已废弃,其中的addPreferencesFromResource() 也就没了
现在建议是:
PreferenceFragment + PreferenceActivity
那现在问题就变成:
如何把之前的:
addPreferencesFromResource(R.xml.tts_preferences);
以及另外一个相关的getPreferenceScreen:
// Set preferences addPreferencesFromResource(R.xml.tts_preferences); activateCheck = (CheckBoxPreference) getPreferenceScreen().findPreference("activate");
改为最新的api的代码
PreferenceActivity | Android 开发者 | Android Developers
addPreferencesFromResource(int preferencesResId)
This method was deprecated in API level 15. This function is not relevant for a modern fragment-based PreferenceActivity.
Inflates the given XML resource and adds the preference hierarchy to the current preference hierarchy.
api=15后就废弃了。
去参考代码
import android.annotation.TargetApi; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceFragment; import android.preference.PreferenceScreen; public class CompatiblePreferenceActivity extends PreferenceActivity { private int prefs=0; //Get/Set public void setPrefs(int prefs) { this.prefs=prefs; } //Exception protected static class PrefsNotSetException extends RuntimeException { private static final long serialVersionUID = 1L; PrefsNotSetException() { super("\"prefs\" should be set to a valid preference resource ID."); } } //Creation @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (prefs==0) throw new PrefsNotSetException(); else try { getClass().getMethod("getFragmentManager"); AddResourceApi11AndGreater(); } catch (NoSuchMethodException e) { //Api < 11 AddResourceApiLessThan11(); } } @SuppressWarnings("deprecation") protected void AddResourceApiLessThan11() { addPreferencesFromResource(prefs); } @TargetApi(11) protected void AddResourceApi11AndGreater() { PF.prefs=prefs; getFragmentManager().beginTransaction().replace( android.R.id.content, new PF()).commit(); } @TargetApi(11) public static class PF extends PreferenceFragment { private static int prefs; @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(prefs); } } //Sub-screen background glitch fix @SuppressWarnings("deprecation") @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { super.onPreferenceTreeClick(preferenceScreen, preference); if (preference!=null) if (preference instanceof PreferenceScreen) if (((PreferenceScreen)preference).getDialog()!=null) ((PreferenceScreen)preference).getDialog(). getWindow().getDecorView(). setBackgroundDrawable(this.getWindow(). getDecorView().getBackground().getConstantState(). newDrawable()); return false; } }
去试试
不过有点不懂
再去下载参考代码
另外去代码中找找tts_preferences
找到了:
samples/api/tts/res/xml/tts_preferences.xml
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <CheckBoxPreference android:key="activate" android:title="@string/label_activate" android:summaryOn="@string/label_summary_activate_on" android:summaryOff="@string/label_summary_activate_off"/> </PreferenceScreen>
另外android studio中没搜到
但是可以通过双击进去界面中
然后右键Go to XML 进入xml
rcsjta/samples/api/tts/res/xml/tts_preferences.xml
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <CheckBoxPreference android:key="activate" android:title="@string/label_activate" android:summaryOn="@string/label_summary_activate_on" android:summaryOff="@string/label_summary_activate_off"/> </PreferenceScreen>
然后注意到了,右上角有3种方式:
Code Split Design
点击了可以看到属性
去看了参考代码
/Users/xxx/dev/src/android/cw-omnibus/Prefs/FragmentsBC/app/src/main/java/com/commonsware/android/preffragsbc/EditPreferences.java
package com.commonsware.android.preffragsbc; import android.os.Bundle; import android.preference.PreferenceActivity; import android.preference.PreferenceFragment; import java.util.List; public class EditPreferences extends PreferenceActivity { @Override public void onBuildHeaders(List<Header> target) { loadHeadersFromResource(R.xml.preference_headers, target); } @Override protected boolean isValidFragment(String fragmentName) { if (First.class.getName().equals(fragmentName) || Second.class.getName().equals(fragmentName)) { return(true); } return(false); } public static class First extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); } } public static class Second extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences2); } } }
/Users/xxx/dev/src/android/cw-omnibus/Prefs/FragmentsBC/app/src/main/java/com/commonsware/android/preffragsbc/FragmentsDemo.java
package com.commonsware.android.preffragsbc; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; public class FragmentsDemo extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.actions, menu); return(super.onCreateOptionsMenu(menu)); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.settings: startActivity(new Intent(this, EditPreferences.class)); return(true); } return(super.onOptionsItemSelected(item)); } }
/Users/xxx/dev/src/android/cw-omnibus/Prefs/FragmentsBC/app/src/main/java/com/commonsware/android/preffragsbc/PreferenceContentsFragment.java
package com.commonsware.android.preffragsbc; import android.app.Fragment; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class PreferenceContentsFragment extends Fragment { private TextView checkbox=null; private TextView ringtone=null; private TextView checkbox2=null; private TextView text=null; private TextView list=null; @Override public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { View result=inflater.inflate(R.layout.content, parent, false); checkbox=(TextView)result.findViewById(R.id.checkbox); ringtone=(TextView)result.findViewById(R.id.ringtone); checkbox2=(TextView)result.findViewById(R.id.checkbox2); text=(TextView)result.findViewById(R.id.text); list=(TextView)result.findViewById(R.id.list); return(result); } @Override public void onResume() { super.onResume(); SharedPreferences prefs= PreferenceManager.getDefaultSharedPreferences(getActivity()); checkbox.setText(Boolean.valueOf(prefs.getBoolean("checkbox", false)).toString()); ringtone.setText(prefs.getString("ringtone", "<unset>")); checkbox2.setText(Boolean.valueOf(prefs.getBoolean("checkbox2", false)).toString()); text.setText(prefs.getString("text", "<unset>")); list.setText(prefs.getString("list", "<unset>")); } }
但还是看不太懂。
目前感觉还是有点复杂。
暂时不去继续花精力解决此问题。后续需要再去继续。
后记:
好像
有简单的实现供参考?
去试试
结果此处:
// addPreferencesFromResource(R.xml.tts_preferences); public static class MyPreferenceFragment extends PreferenceFragment { @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.tts_preferences); } } getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit();
却始终报错
public static class MyPreferenceFragment extends PreferenceFragment
提示:
Modifier static not allowed here
然后:
public class MyPreferenceFragment extends PreferenceFragment
但是又提示:
Modifier 'public' not allowed here
去掉变成:
class MyPreferenceFragment extends PreferenceFragment
又提示:
This fragment class should be public (null)
所以不知道如何改了。
后来放到函数外部:
public static class MyPreferenceFragment extends PreferenceFragment { @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.tts_preferences); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); askPermissions(); // Set title setTitle(R.string.app_title); // Set preferences // addPreferencesFromResource(R.xml.tts_preferences); getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit();
至少没有报错了。
重新编译后,错误消失了。
【总结】
之前代码:
public class Main extends PreferenceActivity implements Preference.OnPreferenceChangeListener { 。。。 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); 。。。 // Set preferences addPreferencesFromResource(R.xml.tts_preferences); 。。。
报错:
告: [deprecation] PreferenceActivity中的addPreferencesFromResource(int)已过时 addPreferencesFromResource(R.xml.tts_preferences); ^
原因:addPreferencesFromResource已废弃
解决办法:
换成新的PreferenceFragment+PreferenceActivity的写法
public class Main extends PreferenceActivity implements Preference.OnPreferenceChangeListener { public static class MyPreferenceFragment extends PreferenceFragment { @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.tts_preferences); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); 。。。 // Set preferences // addPreferencesFromResource(R.xml.tts_preferences); getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit(); 。。。 }
即可。
转载请注明:在路上 » 【已解决】rcsjta项目编译出错:警告 deprecation PreferenceActivity中的addPreferencesFromResource(int)已过时