最近在做一个 app,界面的架构为:一个 Activity 里面嵌套若干个 Fragment,通过侧滑导航栏切换 Activity 中的 Fragment。

为什么要把这篇文章单独拿出来而不放在开发笔记中呢,因为感觉这个比较难实现,其实也不是难实现,而是我在写的过程中尝试了几种方法,最终实现了我想要的功能,故在此记下,以免忘记。

那么我想实现的功能是什么?

我做的是一个翻译 app(即将上线),其中想实现通信的是 TranslateFragment 和 WordbookFragment,即翻译 Fragment 和单词本 Fragment,实现的功能是在单词本中长按某个单词然后查看该单词的具体释义,然后跳转到翻译界面实现翻译然后获取具体释义。

单词本 长按查看具体释义 在翻译界面查看该词具体含义


实现方法其实挺简单,分三个步骤:

1、在 WordbookFragment 中定义一个接口:

public interface sendWord{
        void sendWord(String word);
    }
复制代码

2、在 MainActivity 中实现这个接口:

public class MainActivity extends AppCompatActivity implements BookFragment.sendWord{
    public static TranslateFragment translateFragment;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        translateFragment = new TranslateFragment();
    }  
        .....
        .....
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">sendWord</span><span class="hljs-params">(String word)</span> </span>{
    translateFragment.setWord(word);
}
复制代码

在这里我把一开始 create 的 TranslateFragment 设为 static,即确保只有一个这个实例。然后在实现接口的方法里调用 translateFragment 里面的 set 方法把想要的 String 变量传到 translateFragment 里面去。

3、在 translateFragment 里面接收这个变量:

从单词本回到翻译中,translateFragment 会触发 onResume 这个生命周期,即可以重写 onResume 方法来实现接收变量。 首先在 TranslateFragment 中定义一个变量,接着定义 getter 方法,然后在 onResume 中接收这个变量。

public class TranslateFragment extends Fragment{
     private static EditText input;
     private ImageButton IB_tran;
     public static String word = "";
 ......
 ......
 <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setWord</span><span class="hljs-params">(String word)</span> </span>{
    TranslateFragment.word = word;
 }
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onResume</span><span class="hljs-params">()</span> </span>{
    <span class="hljs-keyword">super</span>.onResume();
    <span class="hljs-keyword">if</span> (word != <span class="hljs-string">""</span>) {
        <span class="hljs-comment">//Toast.makeText(getContext(),word,Toast.LENGTH_SHORT).show();</span>
        input.setText(word);
        IB_tran.performClick();
        word = <span class="hljs-string">""</span>;
    } 
}

}

复制代码

随后在 WordbookFragment 中调用这个方法,就可以实现两个 Fragment 之间的通信。

核心代码:

MainActivity mainActivity = (MainActivity)getActivity();
mainActivity.getResult().setSelection(1);  // 该行代码是在 MaterialDrawer 中选中第一个 Item,使之跳转到 TranslateFragment
mainActivity.sendWord(wordbook.getQuereText());
复制代码

至此可以实现从单词本到翻译的跳转。

不知道这个是不是最好的方法,如果有大神有更好的方法可以在评论区中评论,thanks!

  • Android

    开放手机联盟(一个由 30 多家科技公司和手机公司组成的团体)已开发出 Android,Android 是第一个完整、开放、免费的手机平台。

    293 引用
感谢    赞同    分享    收藏    关注    反对    举报    ...