【问题标题】:Android - send string between activitiesAndroid - 在活动之间发送字符串
【发布时间】:2012-06-22 08:07:14
【问题描述】:

我无法将字符串(包含 URL)从一个活动转移到另一个活动。 我尝试过使用意图,但没有奏效。

我有一个主要活动来设置带有标签的标签主机。 有 3 个选项卡,一个带有条形码扫描仪,一个带有搜索字段和 web 视图。

条形码扫描仪和搜索字段创建一个包含我希望 webview 显示的 Url 的字符串。

有人可以告诉我我遗漏了什么或者我怎样才能做得更好吗?

我的主要活动

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    setTabs() ;
}
private void setTabs()
{
    addTab("Home", R.drawable.tab_home, HomeActivity.class);
    addTab("Search", R.drawable.tab_search, SearchActivity.class);
    addTab("Play", R.drawable.tab_favorite, FavoriteActivity.class);
}

private void addTab(String labelId, int drawableId, Class<?> c)
{
    TabHost tabHost = getTabHost();
    Intent intent = new Intent(this, c);
    TabHost.TabSpec spec = tabHost.newTabSpec("tab" + labelId); 

    View tabIndicator = LayoutInflater.from(this).inflate(R.layout.tab_indicator, getTabWidget(), false);
    TextView title = (TextView) tabIndicator.findViewById(R.id.title);
    title.setText(labelId);
    ImageView icon = (ImageView) tabIndicator.findViewById(R.id.icon);
    icon.setImageResource(drawableId);

    spec.setIndicator(tabIndicator);
    spec.setContent(intent);
    tabHost.addTab(spec);
}

public void switchTab(int tab){
    TabHost tabHost1 = getTabHost();
    tabHost1.setCurrentTab(tab);
}

网页视图标签

public class WebviewActivity extends Activity {
WebView webView;
String url;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.favoritepage);

    url = "http://www.google.nl";

    webView = (WebView)findViewById(R.id.webview);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.setWebChromeClient(new WebChromeClient());
    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
        {
            // Handle the error
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url)
        {
            view.loadUrl(url);
            return true;
        }
    });
    webView.getSettings().setPluginState(WebSettings.PluginState.ON);
    webView.getSettings().setAllowFileAccess(true);
    webView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR);
    webView.loadUrl(url);

    if (savedInstanceState != null)
        ((WebView)findViewById(R.id.webview)).restoreState(savedInstanceState);
}

protected void onSaveInstanceState(Bundle outState) {
    webView.saveState(outState);
 }
}

和搜索标签

public class SearchActivity extends Activity implements OnClickListener {
Button searchButton;
TextView searchText;
TextView searchResultText;
String zoekopdracht, completeTrailerUrl, searchUrl;
String baseURL = "http://not_needed_here";
String endURL = "End_of_url";

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.searchpage);

    searchText=(TextView)findViewById(R.id.searchText);
    searchResultText=(TextView)findViewById(R.id.searchResultText);

    searchButton=(Button)findViewById(R.id.searchButton);
    searchButton.setOnClickListener(this);

}

@Override
public void onClick(View buttonId) {
    // TODO Auto-generated method stub
    switch (buttonId.getId()){
    case R.id.searchButton :
        zoekopdracht = searchText.getText().toString();

        StringBuilder completeURL = new StringBuilder(baseURL);
        completeURL.append(zoekopdracht + endURL);
        searchUrl = completeURL.toString();

        /**start de thread om de xml zoekopdracht te doen */
        new Thread(new Runnable() {
            public void run() {
                try {
                    URL website = new URL(searchUrl);

                    SAXParserFactory spf = SAXParserFactory.newInstance();
                    SAXParser sp = spf.newSAXParser();
                    XMLReader xr = sp.getXMLReader();

                    HandlingXMLStuff doingWork = new HandlingXMLStuff();
                    xr.setContentHandler(doingWork);
                    InputSource is=new InputSource(website.openStream());
                    xr.parse(is);

                    completeTrailerUrl = doingWork.getInformation();


                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
          }).start();
        searchResultText.setText(completeTrailerUrl);
        //I want completeTrailerUrl to be loaded in the webview
        break;
    }
}
}

对桶的反应

我已经把接收类改成了这个,但我认为这是我出错的地方。

public class FavoriteActivity extends Activity {
WebView webView;
String url;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.favoritepage);

    // part submitted by Cool Compiler
    Intent t=getIntent();
    Bundle k = t.getExtras();
    url=k.getString("stringToPassOn");

    if (url != null){
        url = "http://www.google.nl";


    }

    webView = (WebView)findViewById(R.id.webview);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.setWebChromeClient(new WebChromeClient());
    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
        {
            // Handle the error
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url)
        {
            view.loadUrl(url);
            return true;
        }
    });
    webView.getSettings().setPluginState(WebSettings.PluginState.ON);
    webView.getSettings().setAllowFileAccess(true);
    webView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR);
    webView.loadUrl(url);

    if (savedInstanceState != null)
        ((WebView)findViewById(R.id.webview)).restoreState(savedInstanceState);
}

protected void onSaveInstanceState(Bundle outState) {
    webView.saveState(outState);
 }
}

运行时,webview 全黑,旋转时崩溃

06-22 13:32:45.380: W/dalvikvm(1630): threadid=1: thread exiting with uncaught exception (group=0x40a51228)
06-22 13:32:45.400: E/AndroidRuntime(1630): FATAL EXCEPTION: main
06-22 13:32:45.400: E/AndroidRuntime(1630): java.lang.RuntimeException: Unable to stop activity {com.georgekroon.player/com.georgekroon.player.TUplayerV2Activity}: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.georgekroon.player/com.georgekroon.player.FavoriteActivity}: java.lang.NullPointerException
06-22 13:32:45.400: E/AndroidRuntime(1630):     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3505)
06-22 13:32:45.400: E/AndroidRuntime(1630):     at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3585)
06-22 13:32:45.400: E/AndroidRuntime(1630):     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3783)
06-22 13:32:45.400: E/AndroidRuntime(1630):     at android.app.ActivityThread.access$700(ActivityThread.java:139)
06-22 13:32:45.400: E/AndroidRuntime(1630):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1266)
06-22 13:32:45.400: E/AndroidRuntime(1630):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-22 13:32:45.400: E/AndroidRuntime(1630):     at android.os.Looper.loop(Looper.java:156)
06-22 13:32:45.400: E/AndroidRuntime(1630):     at android.app.ActivityThread.main(ActivityThread.java:5005)
06-22 13:32:45.400: E/AndroidRuntime(1630):     at java.lang.reflect.Method.invokeNative(Native Method)
06-22 13:32:45.400: E/AndroidRuntime(1630):     at java.lang.reflect.Method.invoke(Method.java:511)
06-22 13:32:45.400: E/AndroidRuntime(1630):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-22 13:32:45.400: E/AndroidRuntime(1630):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-22 13:32:45.400: E/AndroidRuntime(1630):     at dalvik.system.NativeStart.main(Native Method)
06-22 13:32:45.400: E/AndroidRuntime(1630): Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.georgekroon.player/com.georgekroon.player.FavoriteActivity}: java.lang.NullPointerException
06-22 13:32:45.400: E/AndroidRuntime(1630):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2202)
06-22 13:32:45.400: E/AndroidRuntime(1630):     at android.app.ActivityThread.startActivityNow(ActivityThread.java:1992)
06-22 13:32:45.400: E/AndroidRuntime(1630):     at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135)
06-22 13:32:45.400: E/AndroidRuntime(1630):     at android.app.LocalActivityManager.dispatchStop(LocalActivityManager.java:579)
06-22 13:32:45.400: E/AndroidRuntime(1630):     at android.app.ActivityGroup.onStop(ActivityGroup.java:82)
06-22 13:32:45.400: E/AndroidRuntime(1630):     at android.app.Instrumentation.callActivityOnStop(Instrumentation.java:1266)
06-22 13:32:45.400: E/AndroidRuntime(1630):     at android.app.Activity.performStop(Activity.java:4706)
06-22 13:32:45.400: E/AndroidRuntime(1630):     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3500)
06-22 13:32:45.400: E/AndroidRuntime(1630):     ... 12 more
06-22 13:32:45.400: E/AndroidRuntime(1630): Caused by: java.lang.NullPointerException
06-22 13:32:45.400: E/AndroidRuntime(1630):     at com.georgekroon.player.FavoriteActivity.onCreate(FavoriteActivity.java:25)
06-22 13:32:45.400: E/AndroidRuntime(1630):     at android.app.Activity.performCreate(Activity.java:4543)
06-22 13:32:45.400: E/AndroidRuntime(1630):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071)
06-22 13:32:45.400: E/AndroidRuntime(1630):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2158)
06-22 13:32:45.400: E/AndroidRuntime(1630):     ... 19 more

【问题讨论】:

    标签: android webview android-activity


    【解决方案1】:

    使用捆绑包。

    在你的活动中添加类似

    Bundle bundle = new Bundle ();
    bundle.putSerializable("stringToPassOn", YOUR_STRING);
    
    Intent xxx;
    xxx.putExtras (bundle);
    startActivityForResult (xxx, 0);
    

    您稍后通过以下方式检索信息:

    Bundle bundle = this.getIntent().getExtras();
    String myText = (String) bundle.getSerializable ("stringToPassOn");
    

    【讨论】:

    • 我试过了,但是webview似乎没有响应
    • 这个答案可以在其他一些最相似的问题中找到,我确实先尝试过。 webview 仍然是黑屏(甚至不是白色)并且在旋转时崩溃
    • 第一部分在您调用新活动之前完成。 IE。您单击一个按钮,创建意图,将捆绑包放在其上,然后开始新的意图。在新意图的'onCreate'中,您可以通过代码示例的第二部分检索信息。这是你所做的吗?你有堆栈跟踪吗?
    • 我认为问题是我在 onCreate 部分得到了第二个(接收部分)。它应该在提交时接收它,而不仅仅是 onCreate,现在将一些东西放在一起并将提交又来了
    • FavoritAction 的第 25 行,是哪一行?您检查 URL != null 是否不正确,应该是 'if (url == null)'。在您的代码中,如果 URL 已经有值,它将被覆盖。如果为空,则保持为空。这可能是 Nullpointer 的原因吗?
    【解决方案2】:

    您需要使用捆绑包......然后它必须可以正常工作。例如;

                         s=new Intent(Format1.this, Format17.class);
                        d=new Bundle();
                        d.putString("userId", userId);
                        d.putString("surveyId", surveyId);
                        d.putInt("quesNo", ques_no);
                        s.putExtras(d);
                        startActivity(s);
    

    现在在下一堂课中,您可以检索这样的值

    Intent t=getIntent();
        Bundle k=t.getExtras();
        surveyId=k.getString("surveyId");
        userId=k.getString("userId");
        ques_no=k.getInt("quesNo");
    

    试试这个……

    【讨论】:

    • 抱歉,Format1 和 Format17 指向什么?此外,这看起来像是“桶”给出的答案
    • format1 是当前活动的名称,format17 是您要发送字符串的下一个活动的名称。在您的情况下,您将编写 WebviewActivity 而不是 format17。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 2012-02-03
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多