1. 程式人生 > >自定義介面利用觀察者模式在第二個頁面向第一個頁面傳送資料

自定義介面利用觀察者模式在第二個頁面向第一個頁面傳送資料

這裡不用Intent傳值,主要簡單介紹下interface的使用

效果如下:


首先新建兩個頁面MainActivity和HomeActivity,佈局很簡單,TextView和Button,看也看出來了,不多說了

接著建立一個觀察者介面:

public interface Watcher {
    void update(String str);
}

然後是被觀察者:

public interface Watched {
    public void addWatcher(Watcher wtcher);
    public void notifyWatcher(String str);
}

然後宣告具體的被觀察者:

public class ConcreateWatched implements Watched {
    private List<Watcher> list = new ArrayList<>();
@Override
public void addWatcher(Watcher watcher) {
        list.add(watcher);
}

    @Override
public void notifyWatcher(String str) {
        for (Watcher watcher : list
) { watcher.update(str); } } }

緊接著,宣告具體的觀察者,也就是我們的MainActivity:

public class MainActivity extends AppCompatActivity implements Watcher{
    private static final String TAG = "TAG";
@BindView(R.id.tv_first)
    TextView tvFirst;
   public static String text = "資料:";
@Override
protected void 
onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); } @OnClick(R.id.btn_firstJump) public void onViewClicked() { Intent intent = new Intent(this,HomeActivity.class); startActivity(intent); } @Override public void update(String str) { text = str; } @Override protected void onResume() { super.onResume(); Log.e(TAG, "onResume: " ); tvFirst.setText(text); } private long exitTime = 0;//點選2次返回,退出程式 //點選兩次退出 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { if ((System.currentTimeMillis() - exitTime) > 2000) {//兩秒內再次點選返回則退出 Toast.makeText(getApplicationContext(), "再按一次退出程式", Toast.LENGTH_SHORT).show(); exitTime = System.currentTimeMillis(); } else { System.exit(0); } return true; } return super.onKeyDown(keyCode, event); } }

最後在HomeActivity裡回撥介面就可以了:

public class HomeActivity extends AppCompatActivity {
    Watched watched;
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
ButterKnife.bind(this);
watched = new ConcreateWatched();
Watcher watcher = new MainActivity();
watched.addWatcher(watcher);
watched.notifyWatcher("資料:我是第二個頁面的資料");
}

    @OnClick(R.id.btn_return)
    public void onViewClicked() {
        finish();
}
}

這裡只是簡單介紹介面的用法,一般用在Activity上點選,然後fragment某個控價發生變化時可以用,那個時候intent不能用了吧!

僅供參考,有不對的歡迎提出。