ওয়েবভিউতে ব্যাক বোতাম টিপলে কীভাবে পূর্ববর্তী পৃষ্ঠায় ফিরে যাবেন?


327

আমার একটি অ্যাপ্লিকেশন রয়েছে যাতে আমার একটি WebViewওয়েবসাইট রয়েছে যেখানে আমি কয়েকটি ওয়েবসাইট প্রদর্শন করি। এটি কাজ করে, ওয়েবপৃষ্ঠায় একটি লিঙ্কে ক্লিক করা আমার অ্যাপের অভ্যন্তরে ওয়েবসাইটের পরবর্তী পৃষ্ঠায় যায়। তবে আমি যখন ফোনের পিছনের বোতামটি ক্লিক করি তখন এটি আমাকে সরাসরি আমার অ্যাপে নিয়ে যায়। পরিবর্তে ওয়েবসাইটে আগের পৃষ্ঠায় ফিরে যেতে চাই। কিভাবে আমি এটি করতে পারব?

আমি ব্যবহার করছি কোড নমুনা এখানে:

public class Webdisplay extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
        setContentView(R.layout.webdisplay);

        getWindow().setFeatureInt(Window.FEATURE_PROGRESS,
                Window.PROGRESS_VISIBILITY_ON); 

        Toast loadingmess = Toast.makeText(this,
                "Cargando El Diario de Hoy", Toast.LENGTH_SHORT);
        loadingmess.show();

        WebView myWebView;

        myWebView = (WebView) findViewById(R.id.webview);
        myWebView.getSettings().setJavaScriptEnabled(true);
        myWebView.loadUrl("http://www.elsalvador.com");
        myWebView.setWebViewClient(new WebViewClient());
        myWebView.setInitialScale(1);
        myWebView.getSettings().setBuiltInZoomControls(true);
        myWebView.getSettings().setUseWideViewPort(true);

        final Activity MyActivity = this;
        myWebView.setWebChromeClient(new WebChromeClient() 
        {
            public void onProgressChanged(WebView view, int progress)   
            {
                MyActivity.setTitle("Loading...");
                MyActivity.setProgress(progress * 100); 

                if(progress == 100)
                    MyActivity.setTitle(R.string.app_name);
            }
        });
    }
}

এক্সওয়ালকভিউয়ের জন্য ক্রসওয়াকের এক্সওয়ালকভিউয়ের সাথে ফিরে যেতে বা এটি নিষ্ক্রিয়
ক্রিস রুফ

উত্তর:


520

আমি ওয়েবভিউগুলির সাথে আমার ক্রিয়াকলাপগুলিতে এরকম কিছু ব্যবহার করি:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_DOWN) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                if (mWebView.canGoBack()) {
                    mWebView.goBack();
                } else {
                    finish();
                }
                return true;
        }

    }
    return super.onKeyDown(keyCode, event);
}

সম্পাদনা:

এই কোডটি কাজ করার জন্য, আপনাকে Activityওয়েবভিউ সমেত একটি ক্ষেত্র যুক্ত করতে হবে :

private WebView mWebView;

onCreate()পদ্ধতিতে এটি আরম্ভ করুন এবং আপনার ভাল হওয়া উচিত।

mWebView = (WebView) findViewById(R.id.webView);

1
আমার কি সেই কোডটি রাখা উচিত ছিল? আমার সমস্ত কোডের অধীনে? বা বিল্টিনজুমের মতোই কেবল লসআউআরএল এর নীচে?
zvzej

3
আপনি এটিকে আপনার ক্রিয়াকলাপের ভিতরে রেখেছিলেন তবে অনক্রিট () পদ্ধতির বাইরে।
ফোমাইগুই

আমি যখন আপনার কোডটি রাখি তখন এটি আমাকে এম্বেউভিউ ভেরিয়েবলের জন্য ত্রুটি দেয় যেহেতু অনক্রিটের বাইরে না থাকে, আমি কোথায় এই পরিবর্তনশীলটি রাখব?
zvzej

4
পরিবর্তে finish()করাreturn super.onKeyDown(keyCode, event)
Bostone

6
বা বাস্তবে কেবলমাত্র পুরো elseব্লকটি সরিয়ে ফেলুন
বোস্টনে

300

অ্যান্ড্রয়েড ২.২ এবং তার বেশি (যদি এখন বেশিরভাগ ডিভাইস) ব্যবহার করে থাকেন তবে নীচের কোডটি আপনি যা চান তা পাবেন।

@Override
public void onBackPressed() {
    if (webView.canGoBack()) {
        webView.goBack();
    } else {
        super.onBackPressed();
    }
}

5
খুশী হলাম। আমি এই উত্তরের একটি প্রকরণ ব্যবহার করি, তবে "অন্য" ব্লক ছাড়াই। অন্যথায় যখন ব্যবহারকারী অনেকবার চাপ দেয় তখন তারা কোনও ফাঁকা অ্যাপ্লিকেশন "শুরু" স্ক্রিনে শেষ হয়, ব্যবহারকারীর সামনে এগিয়ে যাওয়ার কোনও বিকল্প নেই।
জর্জ আর্মহোল্ড

1
এটি দেখতে সবচেয়ে উপযুক্ত উত্তরের মতো। @ ক্যাফিনকোমা, আপনি সম্ভবত "অ্যাপ্লিকেশন" ইতিহাসে অ্যাপটি না দেখানোর জন্য আপনার অ্যাপ্লিকেশনটির স্ক্রিনটি কোড করতে পারেন। অ্যান্ড্রয়েড android:noHistory="true"<activity>
ম্যানিফেস্ট.এক্সএমএল-

এটা করা উচিত return;? এটি প্রশিক্ষণ গাইডে করে
কিথ

আপনাকে অনেক ধন্যবাদ!
দিমিত্রিকানুন্নিকফ

এটি কার্যকলাপে নিখুঁতভাবে কাজ করে works (Y)
ওয়াহিদ নাজির

113

এটি আমার সমাধান। এটি খণ্ডেও কাজ করে।

webView.setOnKeyListener(new OnKeyListener()
{
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event)
    {
        if(event.getAction() == KeyEvent.ACTION_DOWN)
        {
            WebView webView = (WebView) v;

            switch(keyCode)
            {
                case KeyEvent.KEYCODE_BACK:
                    if(webView.canGoBack())
                    {
                        webView.goBack();
                        return true;
                    }
                    break;
            }
        }

        return false;
    }
});

16
এই আমার মতামত, এটি সঠিক উত্তর হওয়া উচিত।
অরভিন

2
কেন এই উত্তরটি সঠিক উত্তর হওয়া উচিত? শীর্ষ দুটি উত্তর দিয়ে কোন ইস্যু?
ca9163d9

12
@ dc7a9163d9 কোনও ক্রিয়াকলাপে কীডাউনের উপর নির্ভরশীল একাধিক মতামত বা অবজেক্ট থাকতে পারে। এই উত্তরটি ওয়েবভিউয়ের মাধ্যমে কীডাউন নির্ভরতার উপর ক্রিয়াকলাপের প্রয়োজনীয়তার বাইরে যায় (যা আরও ভাল নকশা)। এছাড়াও, নতুন অ্যাপ্লিকেশনগুলি ক্রিয়াকলাপের বিপরীতে প্রায় টুকরো টুকরো ব্যবহার করে এবং এই উত্তরটি অন্যদের বিপরীতে ব্যবহারের ক্ষেত্রে সমর্থন করে
ডেভিড টি।

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

এটি আরও ভাল হিসাবে সম্মত হন, তাই মূল ক্রিয়াকলাপটি কেবলমাত্র টুকরোগুলি দ্বারা ব্যবহৃত কোনও ওয়েবভিউ রাখা দরকার হয় না।
জান্নিক

18

পরবর্তী বোতাম এবং অগ্রগতি বারের জন্য সম্পূর্ণ রেফারেন্স: ওয়েবভিউতে পিছনে এবং পরবর্তী বোতামটি রাখুন

ফোনের পিছনের বোতামটিতে ক্লিক করার পরে আপনি যদি পিছনের পৃষ্ঠায় যেতে চান তবে এটি ব্যবহার করুন:

@Override
public void onBackPressed() {
    if (webView.canGoBack()) {
        webView.goBack();
    } else {
        super.onBackPressed();
    }
} 

আপনি এর মতো কাস্টম ব্যাক বোতামও তৈরি করতে পারেন:

btnback.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            if (wv.canGoBack()) {
                wv.goBack();
            }
        }
    }); 

16

অনব্যাকপ্রেসডেও ফোকাস করা উচিত

    @Override
    public void onBackPressed() {
        if (mWebview.isFocused() && mWebview.canGoBack()) {
            mWebview.goBack();       
        } else {
            super.onBackPressed();
            finish();
        }
    }

2
কলুষিত মনে হচ্ছে, আপনি দয়া করে কেন ব্যাখ্যা করতে পারেন?
শার্পসি

14

কেন ব্যবহার onBackPressed()করবেন না ?

@Override
public void onBackPressed()
{
    // super.onBackPressed(); Do not call me!

    // Go to the previous web page.
}

কারণ কেবল এসডিকে ২.২ এবং উচ্চতর এই পদ্ধতির সমর্থন করে .. এটি
এসডিকে ১.

1
ওটো, হানিকম্ব এবং আরও নবীনদের কাছে হার্ডওয়ার ব্যাক কী নেই, যার ফলে অনকায়ডাউন কখনও কল হয় না।
জাঙ্কডগ

10

এখানে নিশ্চিত প্রস্থান সহ একটি কোড রয়েছে:

@Override
    public void onBackPressed()
    {
        if(webView.canGoBack()){
            webView.goBack();
        }else{
            new AlertDialog.Builder(this)
            .setIcon(android.R.drawable.ic_dialog_alert)
            .setTitle("Exit!")
            .setMessage("Are you sure you want to close?")
            .setPositiveButton("Yes", new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    finish();    
                }

            })
            .setNegativeButton("No", null)
            .show();    
        }   
    }

6
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // Check if the key event was the Back button and if there's history
    if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
        myWebView.goBack();
        return true;
    }
    // If it wasn't the Back key or there's no web page history, bubble up to the default
    // system behavior (probably exit the activity)
    return super.onKeyDown(keyCode, event);
}

3

কোটলিনে:

override fun onBackPressed() {
    when {
        webView.canGoBack() -> webView.goBack()
        else -> super.onBackPressed()
    }
}

ওয়েবভিউ - সিন্থেটিক রেফারেন্স ব্যবহার করে, এক্সএমএলে ওয়েবভিউ উপাদানটির আইডি।


2

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

//flag with class wide access 
public boolean ploadFailFlag = false;

//your error handling override
@Override
public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {
    onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());
    ploadFailFlag = true;       //note this change 
    .....
    .....
}

//finally to the answer to this question:
@Override
public void onBackPressed() {
    if(checkinWebView.canGoBack()){
        //if page load fails, go back for web view will not go back - no page to go to - yet overriding the super 
        if(ploadFailFlag){
            super.onBackPressed();
        }else {
            checkinWebView.goBack();
        }
    }else {
        Toast.makeText(getBaseContext(), "super:", Toast.LENGTH_LONG).show();
        super.onBackPressed();
    }
}

1

আপনার ক্লাসে নিম্নলিখিত লাইব্রেরিগুলি অনব্যাকপিপ্রেসড পরিচালনা করতে হবে। ক্যানগোব্যাক () ওয়েব ভিউটি আগের পৃষ্ঠার রেফারেন্স করতে পারে কিনা তা যাচাই করে। যদি এটি সম্ভব হয় তবে পূর্ববর্তী পৃষ্ঠাটি (ফিরে যেতে) উল্লেখ করতে goBack () ফাংশনটি ব্যবহার করুন।

 @Override
        public void onBackPressed() {
          if( mWebview.canGoBack()){
               mWebview.goBack(); 
           }else{
            //Do something else. like trigger pop up. Add rate app or see more app
           }
  }

1

কোটলিন সমাধান এখানে:

override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
    if (event?.action != ACTION_UP || event.keyCode != KEYCODE_BACK) {
        return super.onKeyUp(keyCode, event)
    }

    if (mWebView.canGoBack()) {
        mWebView.goBack()
    } else {
        finish()
    }
    return true
}

0

সরকারী কোটলিন ওয়ে:

override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
    // Check if the key event was the Back button and if there's history
    if (keyCode == KeyEvent.KEYCODE_BACK && myWebView.canGoBack()) {
        myWebView.goBack()
        return true
    }
    // If it wasn't the Back key or there's no web page history, bubble up to the default
    // system behavior (probably exit the activity)
    return super.onKeyDown(keyCode, event)
}

https://developer.android.com/guide/webapps/webview.html#NavigatingHistory


0

যদি কেউ কোনও খণ্ডের মধ্যে কোনও ওয়েবভিউর জন্য ব্যাকপ্রেসড পরিচালনা করতে চায় তবে তিনি নীচের কোডটি ব্যবহার করতে পারেন।

  1. কোডটি নীচে আপনার Activityশ্রেণিতে অনুলিপি করুন (এতে একটি খণ্ড রয়েছে YourFragmmentName)

    @Override
    public void onBackPressed() {
    List<Fragment> fragmentList = getSupportFragmentManager().getFragments();
    
    boolean handled = false;
    for(Object f: fragmentList) {
        if(f instanceof YourFragmentName) {
            handled = ((YourFragmentName)f).onBackPressed();
            if(handled) {
                break;
            }
        }
    }
    
    if(!handled) {
        super.onBackPressed();
    }

    }

  2. খণ্ডে এই কোডটি অনুলিপি করুন YourFragmentName

    public boolean onBackPressed() {
       if (webView.canGoBack()) {
           webView.goBack();
           return true;
       } else {
           return false;
       }
    }

মন্তব্য

  • Activity আপনি ব্যবহার করছেন প্রকৃত অবেদনশীলতা শ্রেণীর সাথে প্রতিস্থাপন করা উচিত।
  • YourFragmentName আপনার খণ্ডের নামের সাথে প্রতিস্থাপন করা উচিত।
  • ঘোষণা webViewমধ্যে YourFragmentNameযাতে এটি ফাংশন মধ্যে থেকে অ্যাক্সেস করতে পারবেন।

0

আপনি এটি একটি খণ্ডে ওয়েব দেখার জন্য চেষ্টা করতে পারেন:

private lateinit var webView: WebView

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val root = inflater.inflate(R.layout.fragment_name, container, false)
    webView = root!!.findViewById(R.id.home_web_view)
    var url: String = "http://yoururl.com"
    webView.settings.javaScriptEnabled = true
    webView.webViewClient = WebViewClient()
    webView.loadUrl(url)
    webView.canGoBack()
    webView.setOnKeyListener{ v, keyCode, event ->
        if(keyCode == KeyEvent.KEYCODE_BACK && event.action == MotionEvent.ACTION_UP
            && webView.canGoBack()){
            webView.goBack()
            return@setOnKeyListener true
        }
        false
    }
    return root
}

-2

পৃষ্ঠায় ফিরে যেতে এই কোডটি ব্যবহার করুন এবং যখন শেষ পৃষ্ঠাটি আসবে তখন ক্রিয়াকলাপের বাইরে চলে যান

 @Override
    public void onBackPressed() {
        super.onBackPressed();
        Intent intent=new Intent(LiveImage.this,DashBoard.class);
        startActivity(intent);
    }

-5

কার্যকলাপে ওয়েবভিউ, নীচের কোডটি আমার জন্য কাজ করেছে, ওয়েবভিউজ.ইন-এ ইউআরএল লোড করার পরে ক্রিয়াকলাপ শেষ করুন অন্বেষণ করে এটি আগের ক্রিয়াকলাপে যায়

 webView = (WebView) findViewById(R.id.info_webView);
 webView.loadUrl(value);
 finish();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.