簡體   English   中英

在片段中制作 onBackPressed

[英]Make the onBackPressed in Fragment

如何將活動下面的代碼更改為片段中的代碼? 這是 Android Studio 代碼。 我的頁面現在是 Fragment,我想使用這個代碼,我想修改為片段代碼。 誰知道,請告訴我,謝謝。 而且我還將我當前的代碼放在片段中,並且活動與片段連接。

片段代碼:

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;

}
}

活動代碼:

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();

}
}
}

這是您根據需要的 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;
}

更新以在 webview 中加載上一頁

您的 onCreateView 與您提出的問題相同。 我在 Fragment 中做了一些簡單的改變。

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;
}


}

現在你的活動將是

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();
        
    }
}
}

注意:為了簡單起見,我在這里公開了 webview。 保持私有並使用 getter 訪問它。 如果您想使用更多片段,則為每個片段添加 TAG 並確定哪個片段可見。

來自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
    )
}

替代解決方案 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