Java 从其他类调用MainActivity的方法
我正在开发一个Android应用程序,因此,我有一个Java 从其他类调用MainActivity的方法,java,android,Java,Android,我正在开发一个Android应用程序,因此,我有一个MainActivity类。在MainActivity类中,我有一个方法,我们称它为doSomething(): 我还有一个不同的类(具有不同的布局),称为OtherActivity。我想在其中使用doSomething方法: public class OtherActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState)
MainActivity
类。在MainActivity
类中,我有一个方法,我们称它为doSomething()
:
我还有一个不同的类(具有不同的布局),称为OtherActivity
。我想在其中使用doSomething
方法:
public class OtherActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.other_activity_layout);
// Let's use doSomething()
}
}
我试过这个:
public class OtherActivity extends AppCompatActivity {
MainActivity main;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.other_activity_layout);
// Let's use doSomething()
MainActivity main = new MainActivity();
main.doSomething();
}
}
但它不起作用。我还尝试使OtherActivity
扩展main活动,执行以下操作:
public class OtherActivity extends MainActivity{
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.other_activity_layout);
// Let's use doSomething()
super.doSomething();
}
}
但它不允许我初始化布局
我该怎么办
提前感谢。在活动广播之间进行通信是最好的方式,对于相同的应用程序,我们可以使用LocalBroadcastManager使用本地广播
首先,我们应该在主要活动中注册一个广播
public class MainActivity1 extends AppCompatActivity {
public static final String INTENT_FILTER = "do_some_action";
public static final String INTENT_BUNDLE_VALUE = "value1";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main1);
LocalBroadcastManager.getInstance(this).registerReceiver(
mChangeListener, new IntentFilter(INTENT_FILTER));
}
@Override
protected void onDestroy() {
super.onDestroy();
LocalBroadcastManager.getInstance(this).unregisterReceiver(mChangeListener);
}
private BroadcastReceiver mChangeListener = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intentData) {
// you can do anything here
if (intentData != null && intentData.hasExtra(INTENT_BUNDLE_VALUE)) {
String value = intentData.getStringExtra(INTENT_BUNDLE_VALUE);
doSomeAction(value);
}
}
};
private void doSomeAction(String value) {
}
}
public class OtherActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_other);
// You can call MainActivity to do some actions
Intent intent = new Intent(MainActivity1.INTENT_FILTER);
intent.putExtra(MainActivity1.INTENT_BUNDLE_VALUE, "Any string or any value");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}
然后,要从OtherActivity在MainActivity中执行某些操作,我们可以从OtherActivity发送本地广播,它将到达我们在MainActivity中注册的接收器
public class MainActivity1 extends AppCompatActivity {
public static final String INTENT_FILTER = "do_some_action";
public static final String INTENT_BUNDLE_VALUE = "value1";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main1);
LocalBroadcastManager.getInstance(this).registerReceiver(
mChangeListener, new IntentFilter(INTENT_FILTER));
}
@Override
protected void onDestroy() {
super.onDestroy();
LocalBroadcastManager.getInstance(this).unregisterReceiver(mChangeListener);
}
private BroadcastReceiver mChangeListener = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intentData) {
// you can do anything here
if (intentData != null && intentData.hasExtra(INTENT_BUNDLE_VALUE)) {
String value = intentData.getStringExtra(INTENT_BUNDLE_VALUE);
doSomeAction(value);
}
}
};
private void doSomeAction(String value) {
}
}
public class OtherActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_other);
// You can call MainActivity to do some actions
Intent intent = new Intent(MainActivity1.INTENT_FILTER);
intent.putExtra(MainActivity1.INTENT_BUNDLE_VALUE, "Any string or any value");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}
完成 在活动广播之间进行通信是最好的方式,对于相同的应用程序,我们可以使用LocalBroadcastManager使用本地广播
首先,我们应该在主要活动中注册一个广播
public class MainActivity1 extends AppCompatActivity {
public static final String INTENT_FILTER = "do_some_action";
public static final String INTENT_BUNDLE_VALUE = "value1";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main1);
LocalBroadcastManager.getInstance(this).registerReceiver(
mChangeListener, new IntentFilter(INTENT_FILTER));
}
@Override
protected void onDestroy() {
super.onDestroy();
LocalBroadcastManager.getInstance(this).unregisterReceiver(mChangeListener);
}
private BroadcastReceiver mChangeListener = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intentData) {
// you can do anything here
if (intentData != null && intentData.hasExtra(INTENT_BUNDLE_VALUE)) {
String value = intentData.getStringExtra(INTENT_BUNDLE_VALUE);
doSomeAction(value);
}
}
};
private void doSomeAction(String value) {
}
}
public class OtherActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_other);
// You can call MainActivity to do some actions
Intent intent = new Intent(MainActivity1.INTENT_FILTER);
intent.putExtra(MainActivity1.INTENT_BUNDLE_VALUE, "Any string or any value");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}
然后,要从OtherActivity在MainActivity中执行某些操作,我们可以从OtherActivity发送本地广播,它将到达我们在MainActivity中注册的接收器
public class MainActivity1 extends AppCompatActivity {
public static final String INTENT_FILTER = "do_some_action";
public static final String INTENT_BUNDLE_VALUE = "value1";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main1);
LocalBroadcastManager.getInstance(this).registerReceiver(
mChangeListener, new IntentFilter(INTENT_FILTER));
}
@Override
protected void onDestroy() {
super.onDestroy();
LocalBroadcastManager.getInstance(this).unregisterReceiver(mChangeListener);
}
private BroadcastReceiver mChangeListener = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intentData) {
// you can do anything here
if (intentData != null && intentData.hasExtra(INTENT_BUNDLE_VALUE)) {
String value = intentData.getStringExtra(INTENT_BUNDLE_VALUE);
doSomeAction(value);
}
}
};
private void doSomeAction(String value) {
}
}
public class OtherActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_other);
// You can call MainActivity to do some actions
Intent intent = new Intent(MainActivity1.INTENT_FILTER);
intent.putExtra(MainActivity1.INTENT_BUNDLE_VALUE, "Any string or any value");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}
完成 像这样的东西应该可以解决这个问题,我将制作一个静态导航器来处理您的导航逻辑。如果您反对静态方法,您也可以在应用程序
对象上使用它们,以便更容易地管理依赖项,我只是为了简单起见将其设置为静态
//Making this fully static for simplicity, this is fine for a small app
//you can make it a singleton on the application class for more flexibility
public class Navigator {
//static member vars that determine navigation
// pass in Context if needed for navigation purposes
public static void doSomething(Context context){
// bla bla bla
}
}
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity_layout);
}
private void doSomething() {
Navigator.doSomething(this);
}
}
public class OtherActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.other_activity_layout);
}
private void doSomething() {
Navigator.doSomething(this);
}
}
像这样的东西应该可以做到,我将制作一个静态导航器来处理您的导航逻辑。如果您反对静态方法,您也可以在应用程序
对象上使用它们,以便更容易地管理依赖项,我只是为了简单起见将其设置为静态
//Making this fully static for simplicity, this is fine for a small app
//you can make it a singleton on the application class for more flexibility
public class Navigator {
//static member vars that determine navigation
// pass in Context if needed for navigation purposes
public static void doSomething(Context context){
// bla bla bla
}
}
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity_layout);
}
private void doSomething() {
Navigator.doSomething(this);
}
}
public class OtherActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.other_activity_layout);
}
private void doSomething() {
Navigator.doSomething(this);
}
}
doSomething
到底做什么?它是应该存在于实用类中的东西,还是子类在这里真的有意义?在子类示例中发生了什么,您期望得到什么?我正在使用另一个人编写的代码。。。我认为在MainActivity中包含该方法不是一个好的实践。该方法只是获取一个全局变量的值,并根据该值使用开关启动不同的活动。您只需要在BaseActivity中添加和存储doSomething()方法以及全局变量,以便MainActivity和OtherActivity都可以访问它们。别忘了在BaseActivity中扩展AppCompatActivity。类似这样的内容:“BaseActivity扩展AppCompatActivity”+“MainActivity扩展BaseActivity”+“OtherActivity扩展BaseActivity”。全局的意思是MainActivity
的成员变量吗?在这种情况下,两个示例都会失败,因为您没有使用MainActivity
的原始实例,所以“global”的值可能是错误的。@KevinDiTraglia是的,但事实并非如此。最初的方法使用了MainActivity'的成员变量,但我用一个参数创建了相同的方法。我在
OtherActivity'中指定参数,doSomething
到底做什么?它是应该存在于实用类中的东西,还是子类在这里真的有意义?在子类示例中发生了什么,您期望得到什么?我正在使用另一个人编写的代码。。。我认为在MainActivity中包含该方法不是一个好的实践。该方法只是获取一个全局变量的值,并根据该值使用开关启动不同的活动。您只需要在BaseActivity中添加和存储doSomething()方法以及全局变量,以便MainActivity和OtherActivity都可以访问它们。别忘了在BaseActivity中扩展AppCompatActivity。类似这样的内容:“BaseActivity扩展AppCompatActivity”+“MainActivity扩展BaseActivity”+“OtherActivity扩展BaseActivity”。全局的意思是MainActivity
的成员变量吗?在这种情况下,两个示例都会失败,因为您没有使用MainActivity
的原始实例,所以“global”的值可能是错误的。@KevinDiTraglia是的,但事实并非如此。最初的方法使用了MainActivity'的成员变量,但我用一个参数创建了相同的方法。我在
OtherActivity'中指定参数“如何在广播中传递字符串以便在`private BroadcastReceiver McChangeListener=new BroadcastReceiver()'中接收它?如何在广播中传递字符串以便在`private BroadcastReceiver McChangeListener=new BroadcastReceiver()中接收它?”')?不需要声明导航器nav=new Navigator();在Navigator.doSomething(this)中调用它之前?它被声明为静态的,所以您不需要实例。在doSomething中,我将启动几个活动。我还需要一个onActivityResult方法。它也可能在Navigator中吗?您可以覆盖每个活动上的方法,以调用Navigator来完成某些事情。是否需要声明Navigator nav=new Navigator();在Navigator.doSomething(this)中调用它之前?它被声明为静态的,所以您不需要实例。在doSomething中,我将启动几个活动。我还需要一个onActivityResult方法。它也可能在Navigator中吗?您可以覆盖每个活动上的方法,以调用Navigator来完成某些事情。