2014-07-10 3 views
1

WebViews은 언제든지 표시/숨길 수 있어야하는 HashMap에 저장되어 있습니다.Android에서 WebViews 표시/숨기기

ListView의 행을 탭하면 그 행과 연관된 WebView을 표시하고 다른 모든 행은 숨겨야합니다. 다른 내용물을 언로드하지 않으려면 다른 WebViews을 파괴 할 수 없습니다.

이것이 가능합니까? 하나의 Fragment

생성 및 저장 WebView : 다른 Fragment

public WebView createWebView(Long id) { 
    WebView wv = new WebView(getActivity()); 
    wv.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onPageFinished(WebView view, String url) { 
      view.loadUrl("javascript:(registerCredentialsChangedCallback(function(credentials) {if (credentials.length >= 1) {window.location.href = 'callback:' + credentials;} else {alert('Error: callback set by registerCredentialsChangedCallback was given null string');}}))()"); 
     } 
    }); 
    WebSettings webSettings = wv.getSettings(); 
    webSettings.setJavaScriptEnabled(true); 
    webSettings.setUseWideViewPort(true); 
    webSettings.setLoadWithOverviewMode(true); 

    wv.loadUrl(makeViewerURL(id)); 

    webViews.put(id, wv); 

    return wv; 
} 

onCreate. 나는 WebView 표시해야 FragmentActivity를 통해 ID를 전달하는 interface을 사용하고 있습니다 :

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:background="#FFFFFF" > 

    <WebView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/webview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     /> 
</RelativeLayout> 

감사 : 웹보기를보기의

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

    ListView listView = (ListView) rootView.findViewById(R.id.list); 

    DatabaseHelper dbHelper = new DatabaseHelper(getActivity()); 
    android.R.layout.simple_list_item_1, android.R.id.text1, values); 

    final SimpleCursorAdapter adapter = new SimpleCursorAdapter(getActivity(), android.R.layout.simple_list_item_1, dbHelper.getViewers(), new String[] { "description", "_id" }, new int[] { android.R.id.text1 }, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); 
    listView.setAdapter(adapter); 

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      Long id = adapter.getItemId(i); 

      mCallback.onViewerSelected(id); 
     } 
    }); 

    return rootView; 
} 

XML 레이아웃을 포함해야한다!

답변

1

예, 가능하지만 id와 WebView의 키 값 쌍이 있어야합니다.

private Map<Long, View> mWebViews = new HashMap<Long, View>(); 

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      Long id = adapter.getItemId(i); 
      if(mViews.contains(id)) 
       mWebView = mViews.get(id) 
      else 
       mWebView = createWebView(); 
     } 
    }); 

그런 다음 당신은 사용자가 목록에서 선택한 해당 WebView를 찾아서 볼 수 있도록해야합니다.

mWebView.setVisibility(View.Gone); 

부칙 : 대신 XML 파일에서 웹보기의이 같은 FrameLayout이를 사용

<FrameLayout 
      android:id="@+id/web_container" 
      android:layout_width="fill_parent" 
      android:layout_height="420dip" 
      android:layout_gravity="center" 
      android:clickable="true" 
      android:enabled="true" 
      android:paddingLeft="10dip" 
      android:paddingRight="10dip" /> 

그리고 다음 코드에 웹보기를 추가 숨기기 위해서 WebView 당신은 사용할 필요가 프레임 레이 아웃 :

FrameLayout mWebContainer = (FrameLayout) findViewById(R.id.web_container); 
webView = new WebView(getApplicationContext()); 
mWebContainer.addView(webView); 
+0

감사합니다. 제가해야 할 일은 웹 뷰를 생성 할 때 WebView의 높이와 너비를 설정하는 것입니다. WebView 생성자에서이 작업을 수행해야합니까? –

+0

'Map'과'ListView'는 서로 다른 클래스에 있으므로 꽤 잘 작동하지 않을 것입니다. 이드를'액티비티 '에서'인터페이스'를 통해 다른'프래그먼트 '로 넘겨 주겠다. 그러면 다른'프래그먼트'클래스에서 이것을 사용하여 찾을 수있다. –

+0

WebView를 FrameLayout 또는 다른 곳에 연결할 수있는 xml 레이아웃이 없다면 뷰를 만들 때 설정해야한다고 생각합니다. – Ali

관련 문제