【问题标题】:Passing String to Fragment将字符串传递给片段
【发布时间】:2013-01-11 01:07:36
【问题描述】:

我的 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中的String 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();
        }
    }

}

【问题讨论】:

    标签: android webview fragment android-view


    【解决方案1】:

    或者创建Bundle并使用方法fragment.setArguments(myBundle);进行设置

    【讨论】:

    • 这是在您致电commit() FragmentTransaction 之前完成的
    【解决方案2】:

    这个答案是在片段已经存在的情况下

    您可以在片段中定义公共方法。比如:

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

    之后让您的活动实现 OnClickListener 接口。当按下按钮时,只需输入类似的内容:

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

    【讨论】:

    • 我正在尝试您的建议,但现在我收到了 nullpointerexception 错误。
    • 您的片段是否已附加? NPE 通常意味着 findFragmentById() 返回 null。
    • 当您说是附加的片段时,您的意思是在我执行您上面所说的操作之前它是否在容器中?如果你这样做,那么它不是,当活动开始时只有两个没有内容的选项卡。
    • 那么你应该使用 Nikola Despotoski 的建议,因为如果没有附加片段,getFraagmentById(id) 返回 null。如果您需要一些帮助,我可以解释如何使用他的方法。
    • 我实际上设法让它与你的答案一起工作,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 2020-04-08
    • 2016-06-01
    • 2011-08-16
    相关资源
    最近更新 更多