Android 中如何在java类中调用activity 中的一个方法?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 中如何在java类中调用activity 中的一个方法?相关的知识,希望对你有一定的参考价值。
我导入一个jar包,需要用到这个jar包里面MainActivity的一个方法,这是一个activity好像不能new的方法实例化,然后调用它的方法,请问这个要怎么调用?
通常,您不应该以这种方式创建新的 MainActivity 实例。要打开一个新的 MainActivity,请使用 Intent。在您的情况下,您应该引用原始 MainActivity 实例,并在那里调用此方法。不要以任何方式创建新的,因为您已经在运行它。一个简单的解决方法:
MainActivity.this.myMethod("Hello there")
您不必存储mContext. 你已经在 MainActivity 里面了。
因此,完整的代码将是:
public class MainActivity extends AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView myWebView = findViewById(R.id.webview);
myWebView.loadUrl("http://www.google.com");
myWebView.addjavascriptInterface(new WebAppInterface(), "android");
public void myMethod(String test)
Toast.makeText(this, test, Toast.LENGTH_SHORT).show();
public class WebAppInterface
/** Show a toast from the web page */
@JavascriptInterface
public void showToast(String toast)
MainActivity.this.myMethod("Hello there");
实际上,我认为您甚至可以避免使用MainActivity.this., 并myMethod直接调用。 参考技术A 你如果只是当工具类来用是可以new的然后调用里面的方法
Android - 如何在非 Activity 类中使用 SharedPreferences?
【中文标题】Android - 如何在非 Activity 类中使用 SharedPreferences?【英文标题】:Android - How to use SharedPreferences in non-Activity class? 【发布时间】:2011-11-21 10:06:12 【问题描述】:如何在非 Activity 类中使用 SharedPreferences?我尝试制作一个通用的 Preferences 实用程序类并导入 android.content.Context
,但 Eclipse 仍然不允许我使用 getSharedPreferences()
。
【问题讨论】:
【参考方案1】:在主活动中添加:你将获得全局静态共享首选项对象
companion object
lateinit var sharedPreferences: SharedPreferences
override fun onCreate(savedInstanceState: Bundle?)
sharedPreferences = applicationContext.getSharedPreferences(
SHARED_PREFERENCE_NAME,
Context.MODE_PRIVATE
)
【讨论】:
【参考方案2】:我找到的解决方案是:
1-在 MainActivity 类中(即总是在获取项目中的任何上下文之前启动)为上下文创建一个静态变量:
public static Context contextOfApplication;
2-在该类的一个重要方法(如onCreate、构造函数等)中使用getApplicationContext方法初始化这个变量:
public void onCreate()
contextOfApplication = getApplicationContext();
3-在同一个类中为这个变量创建一个“getter”方法(也必须是静态的):
public static Context getContextOfApplication()
return contextOfApplication;
4-在非活动类中通过静态调用创建的方法获取上下文:
Context applicationContext = MyActivityClass.getContextOfApplication()
;
5-使用PreferenceManager类获取SharedPreferences变量:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(applicationContext);
希望对你有帮助。
【讨论】:
这是一个有用的解决方法,我建议使用 contextOfApplication 作为私有字段 也可以使用 applicationContext.getSharedPreferences(pref_name, MODE_PRIVATE); 这是一个 hacky 解决方案和反模式,在 Activity 中公开一个公共静态 Context 变量。但是,如果您决定采用这种方式,值得注意的是,由于成员public static Context contextOfApplication;
是公共且静态的,因此您不需要 getContextOfApplication()
方法来访问它。在第 4 步中,您只需执行 MyActivityClass.contextOfApplication
即可。【参考方案3】:
在 Kotlin 中,有一个不错且简单的基于包装器的解决方案 - 只需将代码复制并粘贴到一个新的 AppPreferences.kt
文件中并按照 4代码中概述的 TODO 步骤:
import android.content.Context
import android.content.Context.MODE_PRIVATE
import android.content.SharedPreferences
import androidx.core.content.edit
object AppPreferences
private var sharedPreferences: SharedPreferences? = null
// TODO step 1: call `AppPreferences.setup(applicationContext)` in your MainActivity's `onCreate` method
fun setup(context: Context)
// TODO step 2: set your app name here
sharedPreferences = context.getSharedPreferences("<YOUR_APP_NAME>.sharedprefs", MODE_PRIVATE)
// TODO step 4: replace these example attributes with your stored values
var heightInCentimeters: Int?
get() = Key.HEIGHT.getInt()
set(value) = Key.HEIGHT.setInt(value)
var birthdayInMilliseconds: Long?
get() = Key.BIRTHDAY.getLong()
set(value) = Key.BIRTHDAY.setLong(value)
private enum class Key
HEIGHT, BIRTHDAY; // TODO step 3: replace these cases with your stored values keys
fun getBoolean(): Boolean? = if (sharedPreferences!!.contains(name)) sharedPreferences!!.getBoolean(name, false) else null
fun getFloat(): Float? = if (sharedPreferences!!.contains(name)) sharedPreferences!!.getFloat(name, 0f) else null
fun getInt(): Int? = if (sharedPreferences!!.contains(name)) sharedPreferences!!.getInt(name, 0) else null
fun getLong(): Long? = if (sharedPreferences!!.contains(name)) sharedPreferences!!.getLong(name, 0) else null
fun getString(): String? = if (sharedPreferences!!.contains(name)) sharedPreferences!!.getString(name, "") else null
fun setBoolean(value: Boolean?) = value?.let sharedPreferences!!.edit putBoolean(name, value) ?: remove()
fun setFloat(value: Float?) = value?.let sharedPreferences!!.edit putFloat(name, value) ?: remove()
fun setInt(value: Int?) = value?.let sharedPreferences!!.edit putInt(name, value) ?: remove()
fun setLong(value: Long?) = value?.let sharedPreferences!!.edit putLong(name, value) ?: remove()
fun setString(value: String?) = value?.let sharedPreferences!!.edit putString(name, value) ?: remove()
fun remove() = sharedPreferences!!.edit remove(name)
现在,您可以从应用中的任何位置获取值,如下所示:
val heightInCentimeters: Int? = AppPreferences.heightInCentimeters
val heightOrDefault: Int = AppPreferences.heightInCentimeters ?: 170
为SharedPreferences
设置值同样简单:
AppPreferences.heightInCentimeters = 160 // sets a new value
【讨论】:
【参考方案4】:对于 Kotlin 和 default 首选项文件,您可以使用以下代码:
val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE)
【讨论】:
【参考方案5】:在 Kotlin 中你可以这样做:
val myClass = MyClass(this)
现在这是您在课堂上获取上下文的方法
class MyClass(context: Context)
val context: Context = context
现在要获得带有上下文的共享首选项,您可以这样做:
context.getSharedPreferences(...)
【讨论】:
【参考方案6】:使用此代码从活动中获取context
。
if (context != null)
SharedPreferences sharedPrefs = context.getSharedPreferences("YOUR.PACKAGE.NAME", MODE_PRIVATE);
【讨论】:
【参考方案7】:使用静态方法使用 SharedPreference 无需上下文对象 解释here
在 OnCreate
之前的 MainActivitypublic static SharedPreferences preferences;
在OnCreate方法中添加
preferences = getSharedPreferences( getPackageName() + "_preferences", MODE_PRIVATE);
使用 Getters 和 Setters
的静态方法创建一个 PreferenceHelper 类public class PreferenceHelper
final public static String KEY_DEMO_NAME = "Demo Name";
public static void setName(String value)
MainActivity.preferences.edit().putString(KEY_DEMO_NAME, value ).commit();
public static String getName()
return MainActivity.preferences.getString(KEY_DEMO_NAME,"");
【讨论】:
【参考方案8】:创建 SharedPreferences 类
/**
* @param mContext
* @param key
* @param value
*/
public static void savePreferences(Context mContext, String key, String value)
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(key, value).apply();
/**
* @param context
* @param keyValue
* @return
*/
public static String getPreferences(Context context, String keyValue)
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
return sharedPreferences.getString(keyValue, "");
/**
* @param mContext
*/
public static void removeAllSharedPreferences(Context mContext)
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.clear().apply();
【讨论】:
【参考方案9】:将此代码用于新类。
import android.content.Context;
import android.content.SharedPreferences;
/**
* Created by Atiar Talukdar on 6/5/2017.
*/
public class TemporaryStorageSharedPreference
protected final static int DEFAULT = 0;
int temp = 0;
public int readSharedPreference(Context context, String spName,String key)
SharedPreferences sharedPreferences = context.getSharedPreferences(spName, Context.MODE_PRIVATE);
return temp = sharedPreferences.getInt(key,DEFAULT);
public void writeSharedPreference(Context context,String ammount,String spName,String key )
SharedPreferences sharedPreferences = context.getSharedPreferences(spName, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putInt(key, DEFAULT);
editor.commit();
【讨论】:
【参考方案10】:SharedPreferences 与上下文相关。 您只能通过上下文引用它。
您可以简单地将上下文作为参数传递给您的类。 例如在构造函数中。
在你的活动中做:
MyClass myClass = new MyClass(this);
【讨论】:
啊哈!这正是我想要的。感谢您提供简单明了的答案。现在我可以使用context.getSharedPreferences();
访问它。
错误是 MODE_PRIVATE 无法解析为变量
我的活动不允许在我的其他类构造函数中使用this
(带有SharedPreferences
的类)。
@Prasad 使用 0。是一样的。
我们可以使用静态方法freakyjolly.com/shared-preference-context-error-android【参考方案11】:
首先,在你的类中声明一个私有属性。就我而言,我有一个 BaseAdapter 类:
private final Context ctx;
private final Vector<Acto> actos;
public ActoAdaptador(Context ctx, Vector<Acto> as)
super();
this.ctx = ctx;
this.actos = as;
那么,什么时候使用 SharedPreferences:
ctx.getSharedPreferences("com.joninazio.euskofest.UsingPreferences_preferences", Context.MODE_PRIVATE)
这种方式至少对我有用:)
【讨论】:
【参考方案12】:尝试将default preferences 与应用程序上下文一起使用。上下文类似于应用程序在 linux 或 windows 上运行的环境(例如,环境变量,如 PATH 窗口样式或控制台大小)。每个 Activity 和 Service 也有自己的上下文,例如屏幕方向、主题和标签等。但是对于您的应用程序,您不需要 Activity 的上下文,您需要应用程序的全局内容,这就是 context.getApplicationContext()很有用。这在整个应用程序中都是相同的,并且始终会为您提供相同的默认首选项。
【讨论】:
您能详细说明一下吗?我试过SharedPreferences prefs = getDefaultSharedPreferences(this);
,但它不起作用。
使用PreferenceManager.getDefaultSharedPreferences(applicationContext);
无论您在代码中的哪个位置,都需要上下文才能使用首选项。
@DanS - 当他在获取上下文时遇到问题时,您希望他从哪里获取 applicationContext?
@Bamerza 正如我所说,Context
是必需的,其他答案显示如何以静态方式存储Context
。以上是关于Android 中如何在java类中调用activity 中的一个方法?的主要内容,如果未能解决你的问题,请参考以下文章
如何从另一个类(它扩展了 Activity)方法,Android 调用 CCColorLayer 类的方法?
Android Studio中如何在Activity跳转之间传递数据