有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用接口在两个活动之间进行通信

我试图在两个活动之间建立侦听器接口Act1 and Act2Act1将启动Act2。如果在Act2中发生了一些事件,它将通知它Act1。问题是我正在使用Intent启动新的活动,所以Act1如何将自己分配为Act2接口的侦听器呢

Act1。java

public class Act1 extends ActionBarActivity implements
        ActionBar.OnNavigationListener {

    ActionBar actionbar;
    Intent pizzaIntent;
    boolean visibleFirstTime = true;

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

        //set actionbar here
    }

@Override
    public boolean onNavigationItemSelected(int arg0, long arg1)// item pos,
                                                                // itemid
    {
        switch (arg0) {
        case 0:
            if(this.visibleFirstTime == false)
            {
            if(pizzaIntent == null)
            {
                pizzaIntent = new Intent(this,Act2.class);
                //how to call setChangeListener?
            }
            startActivity(pizzaIntent);
            }
            else
                this.visibleFirstTime = false;
            break;
        case 1:
            System.out.println("selected: " + arg0);
            break;
        case 2:
            System.out.println("selected: " + arg0);
            break;
        case 3:
            System.out.println("selected: " + arg0);
            break;
        default:
            break;
        }
        return true;
    }
}

Act2。java

public class Act2 extends Activity {

     selectionChangeListener listener;

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

    public void setChangeListener(selectionChangeListener listener)
    {
        this.listener = listener;
    }

    private interface selectionChangeListener
    {
        public void selectionMadeAtIndex(int index);
    }
}

注意:请不要建议我使用碎片。我想当前使用活动


共 (3) 个答案

  1. # 1 楼答案

    最好、最短和最简单的方法是使用静态变量,如下所示:

    class Main extends Activity {
      static String message = "Hi";
    }
    
    class Another extends Activity {
      public onCreate() {
         Log.i(Main.message); // implementation of the message, 'Hi' 
      }
    }
    
  2. # 2 楼答案

    我建议创建一个model类。让我举个例子:

    模型类:

    public class CustomModel {
    
        public interface OnCustomStateListener {
            void stateChanged();
        }
    
        private static CustomModel mInstance;
        private OnCustomStateListener mListener;
        private boolean mState;
    
        private CustomModel() {}
    
        public static CustomModel getInstance() {
            if(mInstance == null) {
                mInstance = new CustomModel();
            }
            return mInstance;
        }
    
        public void setListener(OnCustomStateListener listener) {
            mListener = listener;
        }
    
        public void changeState(boolean state) {
            if(mListener != null) {
                mState = state;
                notifyStateChange();
            }
        }
    
        public boolean getState() {
            return mState;
        }
    
        private void notifyStateChange() {
            mListener.stateChanged();
        }
    }
    

    下面是您将如何使用它:

    // Imports
    public class MainActivity extends Activity implements OnCustomStateListener {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            CustomModel.getInstance().setListener(this);
    
            boolean modelState = CustomModel.getInstance().getState();
            Log.d(TAG, "Current state: " + String.valueOf(modelState));
    
            Intent intent = new Intent(this, SecondActivity.class);
            startActivity(intent);
        }
    
        @Override
        public void stateChanged() {
            boolean modelState = CustomModel.getInstance().getState();
            Log.d(TAG, "MainActivity says: Model state changed: " + 
                String.valueOf(modelState));
        }
    }
    

    在第二个活动中更改成员国:

    // Imports
    public class SecondActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            CustomModel.getInstance().changeState(true);
        }
    }
    

    LogCat输出:

    Current state: false

    MainActivity says: Model state changed: true

  3. # 3 楼答案

    你考虑过使用LocalBroadcastManager

    在Act1的onCreate中:

    act2InitReceiver= new BroadcastReceiver()
        {
    
            @Override
            public void onReceive(Context context, Intent intent)
            {
                // do your listener event stuff
            }
        };
    LocalBroadcastManager.getInstance(this).registerReceiver(act2InitReceiver, new IntentFilter("activity-2-initialized"));
    

    在Act1的onDestroy中:

    LocalBroadcastManager.getInstance(this).unregisterReceiver(act2InitReceiver);
    

    在Act2的onCreate中:

    LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("activity-2-initialized"));
    

    如果代码没有编译,请给我一个注释,我是手工编写的