通过接口传递2片段之间的ArrayList [英] Passing an ArrayList via interface between 2 fragments

查看:193
本文介绍了通过接口传递2片段之间的ArrayList的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嘿,我试图通过一个的ArrayList 有两个片段之间的接口方法中的一项活动。
在logcat中说,有没有错误,但该项目我添加了的ArrayList 在一个片段不显示我的微调中的其他片段
我会后我的整个code,所以如果你看到我的问题,如果你解释我的解决方案这将是很好。先谢谢了。

MainActivity.java

 包de.kwietzorek.fulcrumwebview;
进口android.app.Activity;
进口android.support.v4.app.Fragment;
进口android.os.Bundle;
进口android.support.v7.app.AppCompatActivity;
进口android.view.LayoutInflater;
进口android.view.Menu;
进口android.view.MenuItem;
进口android.view.View;
进口android.view.ViewGroup;
进口android.webkit.WebSettings;
进口android.webkit.WebView;
进口android.webkit.WebViewClient;
进口android.widget.AdapterView;
进口android.widget.ArrayAdapter;
进口android.widget.Button;
进口android.widget.EditText;
进口android.widget.Spinner;进口的java.util.ArrayList;公共类MainActivity扩展AppCompatActivity实现回调{    静态的WebView myWebView;
    片段AddServerFragment,WebViewFragment;
    ArrayList的<串GT; server_name_list;    @覆盖
    公众的ArrayList<串GT; getArrayListFromActivity(){        WebViewFragment FRAG =(WebViewFragment)getSupportFragmentManager()findFragmentByTag(AddServerFragment);
        如果(FRAG!= NULL){
            server_name_list = frag.getArrayListFromActivity();
        }
        返回server_name_list;
    }    / *菜单* /
    @覆盖
    公共布尔onCreateOptionsMenu(菜单菜单){
        。getMenuInflater()膨胀(R.menu.main,菜单);
        返回true;
    }    @覆盖
    公共布尔onOptionsItemSelected(菜单项项){
        开关(item.getItemId()){
            案例R.id.webview:
                getSupportFragmentManager()调用BeginTransaction()
                        .replace(R.id.container,新WebViewFragment(){                        })
                        。承诺();
                返回true;
            案例R.id.add_server:
                getSupportFragmentManager()调用BeginTransaction()
                        .replace(R.id.container,新AddServerFragment(){                        })
                        。承诺();
                返回true;
            案例R.id.menu_refresh:
                myWebView.reload();
                返回true;
            默认:
                返回true;
        }
    }    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);        如果(findViewById(R.id.container)!= NULL){
            如果(savedInstanceState!= NULL){
                返回;
            }
            AddServerFragment =新片段();
            WebViewFragment =新片段();
        }
        getSupportFragmentManager()调用BeginTransaction()
                .replace(R.id.container,新WebViewFragment(){                })
                。承诺();
    }    / *的WebView片段* /
    公共类WebViewFragment扩展片段{        串选择;
        微调微调;        公共WebViewFragment(){
        }        私人回调回调;
        @覆盖
        公共无效onAttach(活动活动){
            super.onAttach(活动);
            回调=(回调)活动;}        @覆盖
        公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
                                 捆绑savedInstanceState){
            查看查看= inflater.inflate(R.layout.webview,集装箱,FALSE);            / * * web视图/
            myWebView =(的WebView)view.findViewById(R.id.webView);
            myWebView.setWebViewClient(新WEBC());
            WebSettings webSettings = myWebView.getSettings();            / *启用JavaScript的* /
            webSettings.setJavaScriptEnabled(真);            / *服务器名称微调* /            ArrayList的<串GT; server_name_list = callback.getArrayListFromActivity();            如果(server_name_list!= NULL){                微调=(微调)view.findViewById(R.id.server_spinner);
                ;
                ArrayAdapter<串GT; server_adapter =新ArrayAdapter<串GT;(this.getActivity()
                        android.R.layout.simple_spinner_item,server_name_list);                server_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                spinner.setAdapter(server_adapter);                spinner.setOnItemSelectedListener(新AdapterView.OnItemSelectedListener(){                    公共无效onItemSelected(适配器视图<>母公司,观景,INT POS,长I​​D){                        选择= parent.getItemAtPosition(POS)的ToString();                        myWebView.loadUrl(选择);
                    }                    公共无效onNothingSelected(适配器视图<>母公司){                    }
                });
            }
            返回视图。
        }        公众的ArrayList<串GT; getArrayListFromActivity(){
            返回server_name_list;
        }
    }    / *添加服务器碎片* /
    公共类AddServerFragment扩展片段
            实现View.OnClickListener {        @覆盖
        公共无效的onClick(查看视图){
        }        公共AddServerFragment(){
        }        按钮btn_back,btn_add;
        SERVER_IP的EditText,服务器名称;        @覆盖
        公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
                                 捆绑savedInstanceState){
            查看查看= inflater.inflate(R.layout.add_ip,集装箱,FALSE);            SERVER_IP =(EditText上)view.findViewById(R.id.edit_server_address);
            SERVER_NAME =(EditText上)view.findViewById(R.id.edit_server_name);            btn_back =(按钮)view.findViewById(R.id.btn_back);
            btn_back.setOnClickListener(新View.OnClickListener(){                @覆盖
                公共无效的onClick(查看视图){
                    getSupportFragmentManager()调用BeginTransaction()
                            .replace(R.id.container,新WebViewFragment(){                            })
                            。承诺();
                }
            });            btn_add =(按钮)view.findViewById(R.id.btn_add);
            btn_add.setOnClickListener(新View.OnClickListener(){                @覆盖
                公共无效的onClick(查看视图){
                    字符串new_server_ip = NULL,new_server_name = NULL;                    ArrayList的<串GT; server_name_list =新的ArrayList<>();
                    ArrayList的<串GT; server_ip_list =新的ArrayList<>();                    。new_server_ip = server_ip.getText()的toString();
                    server_ip_list.add(new_server_ip);                    。new_server_name = server_name.getText()的toString();
                    server_name_list.add(new_server_name);
                }
            });            返回视图。
        }
    }    / *的WebView客户端* /
    公共类WEBC扩展WebViewClient {        @覆盖
        公共无效onReceivedError(的WebView观点,诠释错误code,描述字符串,字符串failingUrl){            super.onReceivedError(查看,错误code,描述,failingUrl);        }
    }
}

Callback.java

 包de.kwietzorek.fulcrumwebview;进口的java.util.ArrayList;公共接口回调{
        ArrayList的<串GT; getArrayListFromActivity();
    }


解决方案

每个您要添加的东西变成由某些适配器使用(在你的情况下,由适配器微调)ArrayList中你必须调用adapter.notifyDataSetChanged时间() 在上面。所以,你必须告诉WebViewFragment它需要刷新(呼吁适配器notifyDataSetChanged()),它的内容每次你要添加的东西在你的第二个片段ArrayList的时间

Hey I try to pass an ArrayList with the Interface method between two Fragments in one activity. The logcat says there are no errors, but the item I added the ArrayListin the one Fragment is not shown in my Spinner in the other Fragment. I will post my whole code, so if you see my problem, it would be nice if you explain me the solution. Thanks in advance.

MainActivity.java

 package de.kwietzorek.fulcrumwebview;


import android.app.Activity;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity implements Callback {

    static WebView myWebView;
    Fragment AddServerFragment, WebViewFragment;
    ArrayList<String> server_name_list;

    @Override
    public ArrayList<String> getArrayListFromActivity() {

        WebViewFragment frag = (WebViewFragment) getSupportFragmentManager().findFragmentByTag("AddServerFragment");
        if (frag != null) {
            server_name_list = frag.getArrayListFromActivity();
        }
        return server_name_list;
    }

    /* Menu */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.webview:
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.container, new WebViewFragment() {

                        })
                        .commit();
                return true;
            case R.id.add_server:
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.container, new AddServerFragment() {

                        })
                        .commit();
                return true;
            case R.id.menu_refresh:
                myWebView.reload();
                return true;
            default:
                return true;
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (findViewById(R.id.container) != null) {
            if (savedInstanceState != null) {
                return;
            }
            AddServerFragment = new Fragment();
            WebViewFragment = new Fragment();
        }
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.container, new WebViewFragment() {

                })
                .commit();
    }

    /*WebView Fragment*/
    public class WebViewFragment extends Fragment {

        String selected;
        Spinner spinner;

        public WebViewFragment(){
        }

        private Callback callback;


        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            callback = (Callback) activity;}

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.webview, container, false);

            /* WebView */
            myWebView = (WebView) view.findViewById(R.id.webView);
            myWebView.setWebViewClient(new WebC());
            WebSettings webSettings = myWebView.getSettings();

            /* JavaScript Enable */
            webSettings.setJavaScriptEnabled(true);

            /* Server Name Spinner */

            ArrayList<String> server_name_list = callback.getArrayListFromActivity();

            if (server_name_list != null) {

                spinner = (Spinner) view.findViewById(R.id.server_spinner);
                ;
                ArrayAdapter<String> server_adapter = new ArrayAdapter<String>(this.getActivity(),
                        android.R.layout.simple_spinner_item, server_name_list);

                server_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                spinner.setAdapter(server_adapter);

                spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

                    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {

                        selected = parent.getItemAtPosition(pos).toString();

                        myWebView.loadUrl(selected);
                    }

                    public void onNothingSelected(AdapterView<?> parent) {

                    }
                });
            }
            return view;
        }

        public ArrayList<String> getArrayListFromActivity() {
            return server_name_list;
        }
    }

    /*Add Server Fragment*/
    public class AddServerFragment extends Fragment
            implements View.OnClickListener {

        @Override
        public void onClick(View view) {
        }

        public AddServerFragment(){
        }

        Button btn_back, btn_add;
        EditText server_ip, server_name;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.add_ip, container, false);

            server_ip = (EditText) view.findViewById(R.id.edit_server_address);
            server_name = (EditText) view.findViewById(R.id.edit_server_name);

            btn_back = (Button) view.findViewById(R.id.btn_back);
            btn_back.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {
                    getSupportFragmentManager().beginTransaction()
                            .replace(R.id.container, new WebViewFragment() {

                            })
                            .commit();
                }
            });

            btn_add = (Button) view.findViewById(R.id.btn_add);
            btn_add.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {
                    String new_server_ip = null, new_server_name = null;

                    ArrayList<String> server_name_list = new ArrayList<>();
                    ArrayList<String> server_ip_list = new ArrayList<>();

                    new_server_ip = server_ip.getText().toString();
                    server_ip_list.add(new_server_ip);

                    new_server_name = server_name.getText().toString();
                    server_name_list.add(new_server_name);
                }
            });

            return view;
        }
    }

    /* WebView Client */
    public class WebC extends WebViewClient {

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {

            super.onReceivedError(view, errorCode, description, failingUrl);

        }
    }
}

Callback.java

 package de.kwietzorek.fulcrumwebview;

import java.util.ArrayList;

public interface Callback {
        ArrayList<String> getArrayListFromActivity();
    }

解决方案

Each time you're adding something into the ArrayList that is used by some Adapter (in your case by adapter for the spinner) you have to call adapter.notifyDataSetChanged() on it. So you have to "tell" the WebViewFragment that it needs to refresh (call notifyDataSetChanged() on adapter) it's content each time you're adding something to ArrayList in your second fragment

这篇关于通过接口传递2片段之间的ArrayList的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆