通过接口传递2片段之间的ArrayList [英] Passing an ArrayList via interface between 2 fragments
问题描述
嘿,我试图通过一个的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,长ID){ 选择= 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 ArrayList
in 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屋!