Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从其他类调用MainActivity的方法_Java_Android - Fatal编程技术网

Java 从其他类调用MainActivity的方法

Java 从其他类调用MainActivity的方法,java,android,Java,Android,我正在开发一个Android应用程序,因此,我有一个MainActivity类。在MainActivity类中,我有一个方法,我们称它为doSomething(): 我还有一个不同的类(具有不同的布局),称为OtherActivity。我想在其中使用doSomething方法: public class OtherActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState)

我正在开发一个Android应用程序,因此,我有一个
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来完成某些事情。