【问题标题】:how to call a method in another Activity from Activity如何从 Activity 调用另一个 Activity 中的方法
【发布时间】:2013-10-29 18:40:02
【问题描述】:

我正在开发一个我拥有的 Android 应用程序

我有两个班 A 班和 B 班。

在 A 类中,我尝试了如下代码片段,

如何从 Activity 调用另一个 Activity 中的方法?

public class FirstActivity extends Activity {  

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main2);
    }      

    public void method() {
        // some code
    }  
}

public class SecondActivity extends Activity {  

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         setContentView(R.layout.main2);
    
        FirstActivity fact = new FIrstActivity();
    
        fact.method();
    }
}

【问题讨论】:

标签: android android-activity


【解决方案1】:

startActivityForResult 模式更适合您想要实现的目标:http://developer.android.com/reference/android/app/Activity.html#StartingActivities

试试下面的代码

public class MainActivity extends Activity {  

    Button button1;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        textView1=(TextView)findViewById(R.id.textView1);  
        button1=(Button)findViewById(R.id.button1);  
        button1.setOnClickListener(new OnClickListener() {  
            @Override  
            public void onClick(View arg0) {  
                Intent intent=new Intent(MainActivity.this,SecondActivity.class);  
                startActivityForResult(intent, 2);// Activity is started with requestCode 2  
            }  
        });  
    }  
 // Call Back method  to get the Message form other Activity  
    @Override  
       protected void onActivityResult(int requestCode, int resultCode, Intent data)  
       {  
                 super.onActivityResult(requestCode, resultCode, data);  
                  // check if the request code is same as what is passed  here it is 2  
                   if(requestCode==2)  
                         {  
                          //do the things u wanted 
                         }  
     }  

} 

SecondActivity.class

public class SecondActivity extends Activity {  

    Button button1;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_second);  

            button1=(Button)findViewById(R.id.button1);  
            button1.setOnClickListener(new OnClickListener() {  
                @Override  
                public void onClick(View arg0) {  
                    String message="hello ";  
                    Intent intent=new Intent();  
                    intent.putExtra("MESSAGE",message);  
                    setResult(2,intent);  
                    finish();//finishing activity  
                }  
            });  
    }  

}  

如果有帮助请告诉我...

【讨论】:

  • 如何在MainActivity 内获得MESSAGE requestCode==2 块?请解释一下。
  • 从intent(onActivityResult的参数)你可以得到额外的。
【解决方案2】:

您不应创建活动类的实例。这是错误的。 Activity有ui和生命周期,Activity由startActivity(intent)启动

您可以使用startActivityForResult 或者您可以使用意图将值从一个活动传递到另一个活动并执行所需的操作。但这取决于您打算在该方法中做什么。

【讨论】:

  • 那么如何从另一个活动中调用一个方法。
  • @user2932841 你不能用那种方法做什么?
  • @user2932841 你好像又问过这个问题了。似乎是重复的。但是你还想在方法中做什么可以指定吗?
  • 你推荐,或者至少提到,使用 Intents。在另一个(重复)问题上,最流行的答案建议在活动中使用回调方法。我想知道您是否愿意解释一下使用 Intent 与使用回调的优缺点是什么?
  • 如果您需要其他活动的结果,则应使用结果的 Startactivity。当您想要异步任务或工作片段的结果时,您可以使用回调
【解决方案3】:

如果您需要从两个活动中调用相同的方法,为什么不使用第三个对象?

public class FirstActivity extends Activity 
{  

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main2);

    }      

    // Utility.method() used somewhere in FirstActivity
}

public class Utility {

    public static void method()
    {

    }  

}

public class SecondActivity extends Activity 
{  

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main2);

        Utility.method();

    }
}

当然,将其设为静态取决于用例。

【讨论】:

    【解决方案4】:
    public class ActivityB extends AppCompatActivity {
    
    static Context mContext;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);
    
        try {
    
            Bundle bundle = getIntent().getExtras();
            if (bundle != null) {
                String texto = bundle.getString("message");
                if (texto != null) {
                  //code....
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        public static void launch(String message) {
            Intent intent = new Intent(mContext, ActivityB.class);
            intent.putExtra("message", message);
            mContext.startActivity(intent);
        }
    }
    

    在 ActivityA 或服务中。

    public class Service extends Service{
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {    
    
            String text = "Value to send";
            ActivityB.launch(text);
            Log.d(TAG, text);
        }
    }
    

    【讨论】:

      【解决方案5】:

      简单,使用静态。

      在活动中你有你想要调用的方法:

      private static String name = "Robert";
      
      ...
      
      public static String getData() {
          return name;
      }
      

      在您拨打电话的活动中:

      private static String name;
      
      ...
      
      name = SplashActivity.getData();
      

      【讨论】:

        【解决方案6】:

        在 FirstActivity 中声明一个 SecondActivity 变量

        像这样

        public class FirstActivity extends Activity {  
        
        SecondActivity secactivity;
        
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main2);
          }      
        
          public void method() {
            // some code
        
          secactivity.call_method();// 'Method' is Name of the any one method in SecondActivity
        
          }  
        }  
        

        使用这种格式,您可以从一个活动调用任何方法到另一个活动。

        【讨论】:

        • 请更新这个答案,这个解决方案不正确,你应该总是实例化 SecondActivity 对象,这不起作用!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-06
        相关资源
        最近更新 更多