简体   繁体   English

在片段中制作 onBackPressed

[英]Make the onBackPressed in Fragment

How to change code below of activity to the code in Fragment?如何将活动下面的代码更改为片段中的代码? This is Android Studio code.这是 Android Studio 代码。 My page now is Fragment, I want use this code and i want modified to fragment code.我的页面现在是 Fragment,我想使用这个代码,我想修改为片段代码。 If who know, tell me, thanks.谁知道,请告诉我,谢谢。 And I also put my current code in fragment and the activity connect with fragment.而且我还将我当前的代码放在片段中,并且活动与片段连接。

Fragment Code:片段代码:

public class Tab1Fragment extends Fragment {
Context mContext;

public WebView webView;


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.tab1_fragment, container, false);
     mContext = view.getContext();                                             
    webView = (WebView) view.findViewById(R.id.webview);
    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webView.setInitialScale(1);
    webView.getSettings().setLoadWithOverviewMode(true);
    webView.getSettings().setUseWideViewPort(true);
    webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
    webView.setScrollbarFadingEnabled(false);
    webView.getSettings().setBuiltInZoomControls(true);
    webView.loadUrl("https://www.facebook.com/");
    webView.setWebViewClient(new WebViewClient());

    return view;

}
}

Activity code:活动代码:

public class Schedule extends AppCompatActivity {

private static final String TAG = "Schedule";
private SectionsPagerAdapter mSectionsPagerAdapter;

/**
 * The {@link ViewPager} that will host the section contents.
 */
private ViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.schedule);
    Log.d(TAG, "onCreate: Starting.");
    initialiseView();
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    TextView mTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);
    setSupportActionBar(toolbar);
    toolbar.setTitle("SCHEDULE");
    mTitle.setText(toolbar.getTitle());
    getSupportActionBar().setDisplayShowTitleEnabled(false);
    if(getSupportActionBar() !=null){
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }


    // Create the adapter that will return a fragment for each of the three
    // primary sections of the activity.
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);
    setupViewPager(mViewPager);
    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(mViewPager);

}
private void setupViewPager(ViewPager viewPager){
    SectionPageAdapter adapter = new SectionPageAdapter(getSupportFragmentManager());
    adapter.addFragment(new Tab1Fragment(), "4 Sept 2018");
    adapter.addFragment(new Tab2Fragment(), "5 Sept 2018");
    adapter.addFragment(new Tab3Fragment(), "6 Sept 2018");
    viewPager.setAdapter(adapter);
}
 private void initialiseView() {

mTab1Fragment = new Tab1Fragment();

FragmentManager mFragmentManager = getSupportFragmentManager();

FragmentTransaction mFragmentTransaction = mFragmentManager.beginTransaction();

mFragmentTransaction.replace(R.id.container, mTab1Fragment, "TAB 1 FRAGMENT");

mFragmentTransaction.commit();

 }

@Override
public void onBackPressed() {

//Toast.makeText(this, "Calling back pressed", Toast.LENGTH_SHORT).show();

if (mTab1Fragment != null) {

    if (mTab1Fragment.webView.canGoBack()) {

        mTab1Fragment.webView.goBack();

    }

} else {

    super.onBackPressed();

}
}
}

This is your onCreateView method as per your need这是您根据需要的 onCreateView 方法

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.tab1_fragment, container, false);

    webView = (WebView) view.findViewById(R.id.webview);

    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webView.setInitialScale(1);
    
    webView.getSettings().setLoadWithOverviewMode(true);
    webView.getSettings().setUseWideViewPort(true);
    
    webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
    webView.setScrollbarFadingEnabled(false);
    webView.getSettings().setBuiltInZoomControls(true);
    webView.loadUrl("https://www.facebook.com/");
    webView.setWebViewClient(new WebViewClient());

    view.setFocusableInTouchMode(true);
    view.requestFocus();
    view.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View view, int code, KeyEvent keyEvent) {

            if (code == KeyEvent.KEYCODE_BACK && keyEvent.getAction() == KeyEvent.ACTION_UP) {

                //Here is logic to handle back press event
                
                return true;

            }


            return false;
        }
    });

    return view;
}

Update to load previous page inside webview更新以在 webview 中加载上一页

Your onCreateView is same as you put in question.您的 onCreateView 与您提出的问题相同。 I made some simple change in Fragment.我在 Fragment 中做了一些简单的改变。

Tab1 fragment will be like Tab1 片段会像

public class Tab1Fragment extends Fragment {

Context mContext;

public WebView webView;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.tab1_fragment, container, false);

    mContext = view.getContext();

    webView = (WebView) view.findViewById(R.id.webview);

    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webView.setInitialScale(1);
    webView.getSettings().setLoadWithOverviewMode(true);
    webView.getSettings().setUseWideViewPort(true);
    webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
    webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
    webView.setScrollbarFadingEnabled(false);
    webView.getSettings().setBuiltInZoomControls(true);
    webView.loadUrl("https://www.facebook.com/");
    webView.setWebViewClient(new WebViewClient());

    return view;
}


}

Now your Activity will be现在你的活动将是

public class SampleActivity extends AppCompatActivity {

Tab1Fragment mTab1Fragment;

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


    initialiseView();

}

private void initialiseView() {

    mTab1Fragment = new Tab1Fragment();

    FragmentManager mFragmentManager = getSupportFragmentManager();

    FragmentTransaction mFragmentTransaction = mFragmentManager.beginTransaction();

    mFragmentTransaction.replace(R.id.container, mTab1Fragment, "TAB 1 FRAGMENT");

    mFragmentTransaction.commit();

}

@Override
public void onBackPressed() {

    //Toast.makeText(this, "Calling back pressed", Toast.LENGTH_SHORT).show();

    if (mTab1Fragment != null) {

        if (mTab1Fragment.webView.canGoBack()) {

            mTab1Fragment.webView.goBack();

        }

    } else {

        super.onBackPressed();
        
    }
}
}

NOTE: Here I kept webview public just for simplicity.注意:为了简单起见,我在这里公开了 webview。 Keep it private and use getter to access it.保持私有并使用 getter 访问它。 If you want to use more fragments then add TAG for each fragment and identify which fragment is visible.如果您想使用更多片段,则为每个片段添加 TAG 并确定哪个片段可见。

The official solution from android来自android的官方解决方案

override fun onAttach(context: Context) {
    super.onAttach(context)
    val callback: OnBackPressedCallback = object : OnBackPressedCallback(
        true
    ) {
        override fun handleOnBackPressed() {
            // Leave empty do disable back press.
        }
    }
    requireActivity().onBackPressedDispatcher.addCallback(
        this,
        callback
    )
}

Alternate Solution 1替代解决方案 1

override fun onResume() {
    super.onResume()
    requireView().isFocusableInTouchMode = true
    requireView().requestFocus()
    requireView().setOnKeyListener { v, keyCode, event ->
        if (event.action === KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
            // Add your code here
            true
        } else false
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM