Fragment监听返回键

来源:互联网 发布:电气电路图用什么软件 编辑:程序博客网 时间:2024/05/04 14:46

最近在解决系统中一个Bug,问题的原因是6.0版本用的activity来实现的,此时可以实
现onKeyDown方法,但是到了7.0版本发现改成了Fragment来实现,此时就不能实现
onKeyDown方法了,但是逻辑上还是需要监听返回键的,所有问题就是:如何实现
Fragment监听返回键。其中参考了一文章
https://github.com/mxy1228/FragmentHandleBackDemo 但是感觉耦合性太
强了。
综上所述:我的方法是在Activity中添加一内部接口,让fragment来实现。有点类似与
Activity与fragment的通信吧,通信中使用的是在fragment中定义一接口,让Activity
来实现,我的方法跟通信刚好相反。

1,Activity代码
public class KeyEventTest extends AppCompatActivity {    private static final String TAG = "KeyEventTest";    private Fragment mCurrentFragment;    interface FragmentKeyListener {        void onBackPressed();        //如果想监听其他的按键,可以在这里实现onKeyDown等一系列方法        //boolean onKeyDown(int keyCode, KeyEvent event);    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.content_key_event_test);        mCurrentFragment = BlankFragment.newInstance("1", "2");        FragmentManager fm = getFragmentManager();        fm.beginTransaction().add(R.id.container, mCurrentFragment, "blankFragment").commit();    }    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        return super.onKeyDown(keyCode, event);    }    @Override    public void onBackPressed() {        if (mCurrentFragment instanceof FragmentKeyListener) {            ((FragmentKeyListener) mCurrentFragment).onBackPressed();        }        super.onBackPressed();        Log.i(TAG, "onBackPressed");    }}

2,Fragment中代码

public class BlankFragment extends Fragment implements KeyEventTest.FragmentKeyListener{    private static final String TAG = "BlankFragment";    // TODO: Rename parameter arguments, choose names that match    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER    private static final String ARG_PARAM1 = "param1";    private static final String ARG_PARAM2 = "param2";    // TODO: Rename and change types of parameters    private String mParam1;    private String mParam2;    public BlankFragment() {        // Required empty public constructor    }    public static BlankFragment newInstance(String param1, String param2) {        BlankFragment fragment = new BlankFragment();        Bundle args = new Bundle();        args.putString(ARG_PARAM1, param1);        args.putString(ARG_PARAM2, param2);        fragment.setArguments(args);        return fragment;    }    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        if (getArguments() != null) {            mParam1 = getArguments().getString(ARG_PARAM1);            mParam2 = getArguments().getString(ARG_PARAM2);        }    }    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,                             Bundle savedInstanceState) {        // Inflate the layout for this fragment        return inflater.inflate(R.layout.fragment_blank, container, false);    }    @Override    public void onBackPressed() {        Log.i(TAG, "BlankFragment onBackPressed");    }}

如果有哪里不对还请帮忙指正。谢谢

0 0
原创粉丝点击