2013-01-11 140 views
1

我在我的MainActivity中有一個EditText視圖,用戶可以輸入一個URL。這個MainActivity還包含一個將保存WebView的片段。將字符串傳遞給片段

我有它的設置,以便當顯示片段時,URL將加載在WebView中。但是我不知道如何將字符串傳遞給片段?

下面是主要的活動代碼:

public class MainActivity extends FragmentActivity { 

Button goBtn; 
EditText urlInput; 
String url; 

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

    goBtn = (Button)findViewById(R.id.button1); 
    urlInput = (EditText)findViewById(R.id.editText1); 

    goBtn.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      url = "http://"+urlInput.getText().toString(); //THIS TO FRAGMENT! 

      Toast.makeText(v.getContext(), "Search:" + url, Toast.LENGTH_SHORT).show(); 
     } 
    }); 

,這是片段代碼:

WebView webDisplay; 
String url; 
AsyncHttpClient client; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.frag1_layout, container, false); 
    urlDisplay = (TextView)v.findViewById(R.id.textView1); 
    webDisplay = (WebView)v.findViewById(R.id.webView1); 
    return v; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    //url = "http://"+this.getActivity() ??? 
    client = new AsyncHttpClient(); 
    client.get(url, new AsyncHttpResponseHandler(){ 

     @Override 
     public void onSuccess(String response) { 
      Toast.makeText(getActivity(), "Success!", Toast.LENGTH_SHORT).show(); 
      webDisplay.setWebViewClient(new WebViewClient() { 
       public boolean shouldOverrideUrlLoading(WebView view, String url) { 
          view.loadUrl(url); 
          return true; 
       }}); 
      webDisplay.loadUrl(url); 
     } 
    }); 

我擔心它在MainActivity.java字符串URL變量的值。

片段的事務由類TabFragment控制。

public class TabFragment extends Fragment { 

private static final int TAB1_STATE = 0x1; 
private static final int TAB2_STATE = 0x2; 
private int mTabState; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.fragment_tab, container, false); 
    //References to buttons in layout file 
    Button tabBtn1 = (Button)v.findViewById(R.id.tabBtn1); 
    Button tabBtn2 = (Button)v.findViewById(R.id.tabBtn2); 

    //add listener to buttons 
    tabBtn1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      //Action to perform when Tab 1 clicked... 
      goToTab1View(); 

     } 
    }); 

    tabBtn2.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //Action to perform when Tab 2 clicked... 
      goToTab2View(); 
     } 
    }); 

    return v; 

} 

//Tab action functions. 
protected void goToTab1View() { 
    if(mTabState != TAB1_STATE){ 
     mTabState = TAB1_STATE; 
     FragmentManager fm = getFragmentManager(); 
     if(fm!= null){ 
      //Perform fragment transaction 
      FragmentTransaction ft = fm.beginTransaction(); 
      ft.replace(R.id.fragment_content, new FragTab1()); 
      ft.commit(); 
     } 
    } 
} 

protected void goToTab2View() { 
    if(mTabState != TAB2_STATE){ 
     mTabState = TAB2_STATE; 
     FragmentManager fm = getFragmentManager(); 
     if(fm!= null){ 
      //Perform fragment transaction 
      FragmentTransaction ft = fm.beginTransaction(); 
      ft.replace(R.id.fragment_content, new FragTab2()); 
      ft.commit(); 
     } 
    } 

} 

回答

2

這個答案的情況下,該片段已存在

您可以定義在片段的公共方法。例如:

public void setString(final String str) { //... } 

之後,使您的活動實施OnClickListener interfave。而當按下按鈕時,只需鍵入類似的東西:

public void onClick(View view) { 
// Form url... 
((YourWebViewFragment) getFragmentManager().findFragmentById(fragments_id)).setString(url); 
} 
+0

我想你的建議,但現在我得到一個NullPointerException錯誤設置。 – Javacadabra

+2

是否附上你的片段?一個NPE通常意味着'findFragmentById()'返回null。 –

+0

當你說是附帶的片段時,你的意思是在我做上述的事情之前,它是在容器中嗎?如果你這樣做,它不是,當活動開始時,只有兩個標籤沒有內容。 – Javacadabra

6

或者創建Bundle和使用方法fragment.setArguments(myBundle);

+0

我的代碼應該在哪裏做? – Javacadabra

+1

這是在你調用'FragmentTransaction'上的commit()之前完成的 –