繁体   English   中英

Android我自己的听众

[英]Android my own listener

我有一个ActionBar,并且有标签。 在MainActivity中,有一个String变量。 在一个选项卡中,有一个TextView和一个setTv(String string)方法,可以更改其中的文本。

我想做一个侦听器接口,当str字符串在MainActivity中更改时,可以调用setTv(String string)方法。

有人可以帮我在实现中填写此代码吗?

这是MainActivity代码:

public class MainActivity extends FragmentActivity implements ActionBar.TabListener, LocationListener{

    ActionBar actionbar;
    ViewPager viewpager;
    FragmentPageAdapter ft;
    String str;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewpager = (ViewPager) findViewById(R.id.pager);
        ft = new FragmentPageAdapter(getSupportFragmentManager());

        actionbar = getActionBar();
        viewpager.setAdapter(ft);
        actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        actionbar.addTab(actionbar.newTab().setText("Run").setTabListener(this));
        actionbar.addTab(actionbar.newTab().setText("Map").setTabListener(this));
        actionbar.addTab(actionbar.newTab().setText("Statistics").setTabListener(this));
        viewpager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {            

        });

}

这是片段代码:

public class RunFragment extends Fragment {

    TextView tv;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        View view = inflater.inflate(R.layout.run_layout, container, false);
        tv =(TextView)view.findViewById(R.id.textView1);

        return view;

    }


    public void setTv(String string){
        tv.setText(string);
    }

}

在viewpager中获取当前片段:

RunFragment fragment = (RunFragment) ft.getItem(viewPager.getCurrentItem());

在所需的位置调用您的方法(更改str后):

fragment.setTv("string");

为了最好的方式,我建议您制作一个扩展Application的类

从文档:

需要维护全局应用程序状态的人员的基类

因此,您可以将str变量存储在此类中,并通知任何已启动的Activity变量状态更改。 其实我建议使用观察者模式

我的应用程序 :

public class MyApplication extends Application {
    private static MyApplication singleton;
    private String str;
    private ArrayList<StringObserver> observerList = new ArrayList<StringObserver>();
    public MyApplication getInstance(){
        return singleton;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        singleton = this;
    }

    public void setString(String str) {
        this.str = str;
        notifyObservers();
    }

    public void addObserver(StringObserver obs) {
        observerList.add(obs);
    }

    public void removeObserver(StringObserver obs) {
        observerList.remove(obs);
    }

    private void notifyObservers() {
        for(StringObserver obs : observableList) {
            obs.notifyAboutStringChanged(str);
        }
    }
}

StringObserver:

public interface StringObserver {
    void notifyAboutStringChanged(String str);
}

和用法:

public class MainActivity extends FragmentActivity/*or Activity*/ implements StringObserver {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        MyApplication appState = ((MyApplication )this.getApplication());
        appState.addObserver(this);
        appState.setString("This string was changed");
    }

    @Override
    public void notifyAboutStringChanged(String str) {
     // do something
    }

}

在其他活动/片段中:

public class RunFragment extends Fragment {

    TextView tv;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        View view = inflater.inflate(R.layout.run_layout, container, false);
        tv =(TextView)view.findViewById(R.id.textView1);

        return view;

    }


    public void setTv(String string){
        tv.setText(string);
        (MyApplication) getActivity().getApplication().setString(string); // this string notify your activity about value change.
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM