【问题标题】:How to properly initialize interface in Activity?如何正确初始化Activity中的界面?
【发布时间】:2017-04-03 11:49:44
【问题描述】:

我有这个界面:

public interface SomeInterface {

    void doSomething();
}

我正在尝试在主要活动中对其进行初始化,并尝试将其“发送”到第二个活动:

private SomeInterface someInterface;

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

    someInterface = (SomeInterface) this;
    someInterface.doSomething();
}

我在第二个活动中实现了接口。

public class SecondActivity extends Activity implements SomeInterface  {

    @Override
    public void doSomething() {

    }
}

但这不起作用,我收到以下错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{package.name/package.name.MainActivity}: java.lang.ClassCastException: android.app.Application cannot be cast to package.name.AppInterface

我做错了什么?提前谢谢你。

【问题讨论】:

  • Michalsx,您需要在要处理 doSomething 事件的活动类中实现接口。检查这个答案,stackoverflow.com/a/18585247/4862126
  • MainActivity 应该实现 SomeInterface 而不是 SeconActivity

标签: android interface initialization


【解决方案1】:

您需要在 Activity 类中实现 SomeInterface

someInterface = (SomeInterface) this;

这里 this 指的是您的 Activity 而不是您尚未实现的接口。 因此 ClassCastException

【讨论】:

  • 我明白了,抱歉我的解释不好。我想用它来进行活动之间的交流。我试图在第二个活动中调用“doSomething”。该怎么做?
  • 使用模型类参考这个http://stackoverflow.com/a/19027202/3022836
【解决方案2】:

试试这个:::

SomeInterface myListener=null;

public MainActivity(SomeInterface ml) {
    myListener = ml;
}

并在您的 MainActivity 中实现它

public void SomeMethod(){
//Some Code here;
myListener.doSomething("passed");
}

然后在第二个调用它

@Override
public void doSomething(String str) {
//you will get your passed text here in str.
}

【讨论】:

    【解决方案3】:

    I used custom model suggested by Kunu:

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Toast.makeText(this, "MainActivity", Toast.LENGTH_LONG).show();
            CustomModel.getInstance().changeState(true);
        }
    }
    

    .

    public class SecondActivity extends Activity implements CustomModel.OnCustomStateListener {
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Toast.makeText(this, "SecondActivity", Toast.LENGTH_LONG).show();
            CustomModel.getInstance().setListener(this);
            startActivity(new Intent(this, MainActivity.class));
        }
    
        @Override
        public void stateChanged() {
            Toast.makeText(this, "stateChanged", Toast.LENGTH_LONG).show();
        }
    }
    

    首先我启动了第二个活动,在 main 之后,我保留了这个混淆顺序以保持它与问题相同。

    【讨论】:

      【解决方案4】:
      public class YourActivity extends Activity implements SomeInterface {
      
        private SomeInterface someInterface;
      
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
      
            // please add correct reference 
            someInterface = (SomeInterface) new SecondActivity();
      
            someInterface.doSomething();
        }
      }
      

      【讨论】:

        【解决方案5】:

        你需要实现接口..试试这个

        public class YourActivity extends Activity implements SomeInterface {
        
          private SomeInterface someInterface;
        
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
        
              someInterface = (SomeInterface) this;
              someInterface.doSomething();
          }
        }
        

        【讨论】:

        • 我明白了,抱歉我的解释不好。我想用它来进行活动之间的交流。我试图在第二个活动中调用“doSomething”。该怎么做?
        【解决方案6】:

        我会采取你想要做的是,一旦第一个活动中的 doSomething 发生了变化,你的第二个活动就会识别它。

        那你可以试试这个

        public Interface SomeInterface
        {
           void doSomething(); // here you may pass in some para maybe you want to use it to communicate with other activties
        }
        

        然后在第一个活动中你会得到接口的实例

         public class FirstActivity extends AppCompatActivity
         {
            SomeInterface someInterface;
            @Override
            protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        
            someInterface = (SomeInterface) this;
            someInterface.doSomething();
        }
        }
        

        在第二个活动中实现接口

        public void SecondActivity implements SomeInterface
        {
           @Override
           public void doSomething()
           {
              // here it will run once doSomething is called in first activity,and if the interface in first activity has params, it would be passed here
           }
        }
        

        【讨论】:

        • 给出这个错误'Activity不能被转换为callbackInterface'
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-25
        • 1970-01-01
        • 1970-01-01
        • 2022-01-01
        • 2010-11-11
        • 1970-01-01
        • 2015-05-28
        相关资源
        最近更新 更多