অ্যান্ড্রয়েড - রোটেটে ওয়েবভিউ পুনরায় লোড আটকাচ্ছে


91

আমি যখন আমার স্ক্রিনটি ঘোরান তখন ওয়েবভিউ পুরো পৃষ্ঠাটি পুনরায় লোড করে। আমার কিছু বিষয়বস্তুতে গতিশীল / এলোমেলো উপাদান রয়েছে বলে আমার এটি থাকতে পারে না। বর্তমানে যখন ঘোরানো হয় তখন স্ক্রিনটি লোডআরএল () পদ্ধতি থেকে মূল URL টি পুনরায় লোড করে।

আমার কোড এর সাথে কি ভুল আছে?

মেইনএ্যাকটিভিটি.জভা

package com.mark.myapp;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends Activity {

    WebView web;
    String webURL = "http://www.google.co.uk/";

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

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

        web = (WebView) findViewById(R.id.web);
        web.getSettings().setJavaScriptEnabled(true);
        web.loadUrl(webURL);
        web.setPadding(0, 0, 0, 0);
        web.getSettings().setLoadWithOverviewMode(true);
        web.getSettings().setUseWideViewPort(true);
        web.getSettings().setSupportZoom(true);
        web.getSettings().setBuiltInZoomControls(true);

        web.setWebViewClient(new HelloWebViewClient());
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    private class HelloWebViewClient extends WebViewClient {
        public boolean shouldOverrideUrlLoading(WebView web, String url) {
            web.loadUrl(url);
            return true;
        }
    }

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) {
            web.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

}

AndroidManLive.xML

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mark.myapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"

            android:configChanges="orientation|keyboardHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>

4
সরলিকৃত সমাধান যা আমি নিজে ব্যবহার করেছি এবং এটি প্রস্তাব করতে পারি এখানে: twigstechtips.blogspot.com/2013/08/…
Andrius বারুকিস

উত্তর:


103

আমি মনে করি মূল সমস্যাটি হ'ল আপনি ওয়েব.লোডআরএল (ওয়েব ইউআরএল) কল করেছেন; এছাড়াও যখন SaveInstanceState! = নাল

সম্পাদনা

চেষ্টা করুন:

if (savedInstanceState == null)
{
  web.loadUrl(webURL);
}

EDIT2 : আপনারও onSaveInstanceState এবং onRestoreInstanceState ওভাররাইড দরকার।

@Override
protected void onSaveInstanceState(Bundle outState )
{
super.onSaveInstanceState(outState);
web.saveState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
{
super.onRestoreInstanceState(savedInstanceState);
web.restoreState(savedInstanceState);
}

দ্রষ্টব্য: দয়া করে আপনার ক্রিয়াকলাপ অ্যান্ড্রয়েডে আপনার অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল যুক্ত করুন: কনফিগারেশন = "ওরিয়েন্টেশন | স্ক্রিন সাইজ" ধন্যবাদ


4
হ্যাঁ! এটি আমার জন্য কাজ করে (সম্পাদনার পরে, টিম স্পটড!)! ধন্যবাদ! আপনি সম্ভবত ব্যাখ্যা করতে পারেন কেন এটি এবং কীভাবে কাজ করে এবং কেন সেই পদ্ধতিগুলিকে ওভাররাইডিংয়ের প্রয়োজন ছিল?
চিহ্নিত করুন


একটি শেষ কথা, আমার কি সত্যই নীচের নীচের if-বিবৃতি দরকার: যদি (সেভডআইনস্ট্যান্সস্টেট! = নাল) ((ওয়েবভিউ) ফাইন্ড ভিউবিআইডি (আর.আইডি.ওয়েব))।
চিহ্নিত করুন

21
এটি একই পৃষ্ঠাটি রাখে তবে এখনও স্ক্রিন ঘোরানোতে পুনরায় লোড করুন
গ্রাস্পার

4
যদি আমি অ্যান্ড্রয়েড যুক্ত করি তবে এটি কাজ করে: অ্যান্ড্রয়েড ম্যানিফেস্টে কনফিগারেশন << কার্যকলাপ> -এ পরিবর্তন করে, তাই আপনার উত্তর থেকে দুটি জিনিস যোগ করুন। : এখানে একটি ভাল উত্তর যে সব তিনটি বিষয় অন্তর্ভুক্ত করে stackoverflow.com/a/46849736/454780
trusktr

63

কোনও জাভা কোডিংয়ের দরকার নেই। আপনার প্রকাশিত ফাইলটিতে এটি ব্যবহার করুন।

 android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"

পছন্দ:

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.Example.WebviewSample.webviewsample"
        android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>        
</application>

4
আপনি কি পরিবর্তন সম্পর্কে কথা বলছেন?
প্রতীক পোদ্দার

মগামের্জের মন্তব্য অনুসরণ করে .. বিষয়টি যখন ঘুরছে তখন .. এটি আপনি দিতে পারেন এমন সবচেয়ে খারাপ পরামর্শ
গিলহেরেম অলিভিরা

54
Noooooooooooo। এমনকি এটি করার কথা ভাবেন না। কনফিগারেশন পরিবর্তনগুলি ঘোরার মধ্যে সীমাবদ্ধ নয়। এছাড়াও, স্বল্প স্মৃতি থেকে ফিরে আসার পরে উদাহরণস্বরূপ অবস্থা পুনরুদ্ধার করা যায়। এখানে সমস্যা হ'ল আপনি যখন এটি করবেন তখন কনফিগারেশনটি সঠিকভাবে আপডেট হবে না। দয়া করে, কেউ এই কাজ করে না
এরিক কোচরান

6
@ এরিককোচরান আপনি যদি সঠিক উত্তরটি লিখতে পারেন তবে যদি আপনি একটি জানেন? গৃহীত উত্তরগুলি এখনও আমার জন্য পৃষ্ঠা পুনরায় লোড করে, এটি সেশনের তথ্যও হারায়। আমার ক্ষেত্রে যা বাহের মতো, আপনি ফোন ঘুরিয়েছেন - আপনাকে আবার লগইন করতে হবে।
অ্যাটমস্ক

এটি কেবলমাত্র একটি সম্পূর্ণ উত্তরের অংশ হতে পারে। : এই ভাল এক দেখতে stackoverflow.com/a/46849736/454780
trusktr

20

ট্যাগে (প্রকাশ)

android:configChanges="orientation|screenSize"

9
onConfigurationChangedকোনও কাস্টম কার্যকারিতা যুক্ত না হওয়ায় আসলে পদ্ধতিটি ওভাররাইড করার কোনও কারণ নেই। মেনিফেস্ট ফাইলটিতে কেবল পরিবর্তন করা আমার জন্য কৌশলটি করেছে।
i2097i

ম্যানিফেস্টটি যথেষ্ট ছিল, এবং কেবল যুক্ত করার জন্য উর্ধ্বতনorientation|screenSize
বরুণ গার্গ

14

android:configChanges="orientation|screenSize"প্রকাশ্যে যুক্ত করা আমার পক্ষে কাজ করে

<activity
            android:name="com.example.HelloWorld.WebActivity"
            android:label="@string/title_activity_web"
            android:configChanges="orientation|screenSize" >
</activity>

আপনার ওয়েবঅভিউ সম্পর্কিত মূল কার্যকলাপ কী পোস্ট করতে পারে?
trusktr

8

আমি বিশ্বাস করি না এটি আর কাজ করবে। আমার ক্ষেত্রে, ব্যবহার করে রাষ্ট্র পুনরুদ্ধারWebView.restore(Bundle savedInstanceState) এখনও ইউআরএল পুনরায় লোড ট্রিগার ।

আপনার জন্য দস্তাবেজগুলির দিকে তাকানোrestoreState() এটি দেখতে পাবেন:

যদি এই ওয়েবভিউয়ের পরে রাষ্ট্রটি তৈরি করার (পেজ লোড করা, একটি পিছনে / ফরোয়ার্ড তালিকা তৈরি করা ইত্যাদি) সুযোগ পাওয়ার পরে বলা হয় তবে অনাকাঙ্ক্ষিত পার্শ্ব-প্রতিক্রিয়া হতে পারে।

এবং

দয়া করে নোট করুন যে এই পদ্ধতিটি আর এই ওয়েবভিউর জন্য প্রদর্শন ডেটা পুনরুদ্ধার করে না।

তার উত্তরে আমাকে সঠিক দিকে ইশারা করার জন্য @ e4c5 এ প্রপস

এবং অবশ্যই, ক্রিয়াকলাপের চূড়ান্ত কোর্সটি হ'ল ওরিয়েন্টেশন পরিবর্তনগুলি ক্রিয়াকলাপ ধ্বংস / সৃষ্টি ট্রিগার থেকে রোধ করা। এটি কীভাবে করবেন তার জন্য ডকুমেন্টেশন এখানে



4

onConfigChangeওরিয়েন্টেশন পরিবর্তনে ডেটা পুনরায় লোড এড়ানোর জন্য পদ্ধতিটি ওভাররাইড করুন

আপনার ক্রিয়াকলাপ AndroidMainfestফাইল এ।

android:configChanges="orientation|keyboardHidden" 

এবং এটি আপনার ওয়েবভিউ সেটিংসেও রয়েছে

webview.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
webview.loadUrl("Your URL To Load");

4

আপনার প্রকাশিত ফাইলটিতে এটি ব্যবহার করে দেখুন:

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"

4

এটি ম্যানিফেস্ট.এক্সএমএল ফাইল ক্রিয়াকলাপে রাখুন:

android:configChanges="orientation|screenSize"

এখানে একটি উদাহরণ:

<activity android:name=".MainActivity"
          android:label="@string/app_name"
          android:theme="@style/AppTheme.NoActionBar"
          android:configChanges="orientation|screenSize">
          <intent-filter>
                <category android:name="android.intent.category.DEFAULT" />
          </intent-filter>
</activity>

4

এখানে উদ্ধৃত হিসাবে ,

সতর্কতা: অ্যান্ড্রয়েড ৩.২ (এপিআই লেভেল ১৩) দিয়ে শুরু করে, ডিভাইস প্রতিকৃতি এবং ল্যান্ডস্কেপ অভিমুখের মধ্যে স্যুইচ করলে "স্ক্রিনের আকার" পরিবর্তন হয় changes সুতরাং, যদি আপনি API স্তরের 13 বা ততোধিক (minSdkVersion এবং টার্গেটএসডিকি ভার্সন বৈশিষ্ট্য দ্বারা ঘোষিত হিসাবে) বিকাশকালে ওরিয়েন্টেশন পরিবর্তনের কারণে রানটাইম পুনরায় চালু করতে বাধা দিতে চান, আপনাকে অবশ্যই "ওরিয়েন্টেশন" মানের সাথে "স্ক্রিনসাইজ" মানটি অন্তর্ভুক্ত করতে হবে। এটি হ'ল, আপনাকে অবশ্যই অ্যান্ড্রয়েড ডিক্লেয়ার করতে হবে: configChanges = "ওরিয়েন্টেশন | স্ক্রিনসাইজ"। তবে, যদি আপনার অ্যাপ্লিকেশনটি এপিআই লেভেল 12 বা তার চেয়ে কমের লক্ষ্যবস্তু করে, তবে আপনার ক্রিয়াকলাপ সর্বদা এই কনফিগারেশন পরিবর্তনটিকে নিজেরাই পরিচালনা করে (কোনও অ্যান্ড্রয়েড 3.2 বা উচ্চতর ডিভাইসে চলাকালীন এই কনফিগারেশন পরিবর্তনটি আপনার ক্রিয়াকলাপটি পুনঃসূচনা করে না)।

বিন্যাস android:configChanges="orientation|screenSize"আপনার ক্রিয়াকলাপে করা এই সমস্যাটি সমাধান করবে।

এছাড়াও, নিম্নলিখিত নোট নিতে

মনে রাখবেন: আপনি যখন কোনও কনফিগারেশন পরিবর্তন পরিচালনা করতে আপনার ক্রিয়াকলাপটি ঘোষণা করেন, আপনি যে কোনও উপাদানগুলির জন্য বিকল্প সরবরাহ করেন তা পুনরায় সেট করার জন্য আপনি দায়বদ্ধ। যদি আপনি ওরিয়েন্টেশন পরিবর্তন পরিচালনা করতে আপনার ক্রিয়াকলাপটি ঘোষণা করেন এবং ল্যান্ডস্কেপ এবং প্রতিকৃতিগুলির মধ্যে পরিবর্তিত হওয়া চিত্রগুলি থাকে তবে আপনাকে অবশ্যই কনফিগারেশনচেনজড () -র সময় প্রতিটি উপাদানকে প্রতিটি সংস্থান পুনরায় বরাদ্দ করতে হবে।


3

এই সমাধানটি আমার পক্ষে ভাল কাজ করে:

(1) এন্ড্রয়েড ম্যানিফেস্ট.এক্সএমএলে এই লাইনটি যুক্ত করুন অ্যান্ড্রয়েড: কনফিগারেশন = "কীবোর্ড | কীবোর্ডহাইডার | অভিমুখ

এটি পছন্দ করুন (এবং উপরের উত্তরগুলি পছন্দ করুন)

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainActivity"
        android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

(২) তারপরে মেইনএকটিভিটি.জভাতে সেভড ইনস্ট্যান্সস্টেট যাচাই করুন

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mainContext = getApplicationContext();
    ----
    myWebView = (WebView) findViewById(R.id.webView);
    prepareWebView();
    myWebView.addJavascriptInterface(myJavaScriptInterface, "WEB2Android");

    if (savedInstanceState == null) {
        myWebView.post(new Runnable() {
            @Override
            public void run() {
                myWebView.loadUrl("http://www.appbiz.ro/foto_konta");
            }
        });
    }
    ----
}

(3) এবং তারপরে:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
}

@Override
protected void onSaveInstanceState(Bundle outState )
{
    super.onSaveInstanceState(outState);
    myWebView.saveState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
{
    super.onRestoreInstanceState(savedInstanceState);
    myWebView.restoreState(savedInstanceState);
}

0

এটিকে অ্যান্ড্রয়েডম্যানিফেস্ট.এক্সএমএল যুক্ত করুন:

<activity android:name=".MyActivity"
    android:configChanges="orientation|screenSize|screenLayout|keyboardHidden">

এখন, যখন এই কনফিগারেশনের একটি পরিবর্তন হয়, MyActivityপুনরায় আরম্ভ হবে না। পরিবর্তে, MyActivityএকটি কল গ্রহণ onConfigurationChanged()

এটি যুক্ত করুন:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    }
    else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.