I am trying to finish my activity from fragment BackPressed.But the Key Listener is not at all get called.I have searched but its about the EditText problem most of the time.Below is my code:
public class ProductFragment extends Fragment {
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.product_fragment, container,false);
view.setOnKeyListener( new View.OnKeyListener() {
#Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if (keyCode == KeyEvent.KEYCODE_BACK) {
getActivity().finish();
return true;
}
return false;
}
});
}
Maybe you can just override the onBackPressed() on the holding Activity. It will give the result you're looking for. Check it out: http://developer.android.com/reference/android/app/Activity.html#onBackPressed()
Related
The onKeyListener() in a Fragment is not working now. Here's the part of the code.
#Nullable
#Override
public View onCreateView(LayoutInflater inflater, #Nullable ViewGroup container, #Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, null);
...
view.setFocusableInTouchMode(true);
view.requestFocus();
view.setOnKeyListener(new View.OnKeyListener() {
// true if the listener has consumed the event, false otherwise.
// the key event happens twice, when pressing and taking off.
#Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK && !touched) {
Log.i(TAG, "onKey() method");
touched = true;
return true;
} else {
return false;
}
}
});
return view;
}
Is there anything I am missing?
try this:
#Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
#Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
//go to previous fragemnt
//perform your fragment transaction here
//pass data as arguments
return true;
}
}
return false;
}
});
}
This worked for me, for both Fragment & DialogFragment.
For Fragment:
#Override
public void onResume() {
super.onResume();
// Disable back press
requireView().setFocusableInTouchMode(true);
requireView().requestFocus();
requireView().setOnKeyListener((v, keyCode, event) -> keyCode == KeyEvent.KEYCODE_BACK);
}
For DialogFragment:
#Override
public void onResume() {
super.onResume();
requireDialog().setOnKeyListener((dialog, keyCode, event) ->
// Disable back pressed
keyCode == android.view.KeyEvent.KEYCODE_BACK
);
}
i am trying to disable the back button in my device with the following code.
the code is working but i would like that the function that handle all the back button request in the fragments will derived from the Main Activity
this is the back button handler:
#Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
#Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
Toast.makeText(getActivity(), "Please navigate via the menu", Toast.LENGTH_SHORT).show();
return true;
}
}
return false;
}
});
}
It's easier to override onBackPressed function:
private boolean disabled = true;
#Override
public void onBackPressed() {
if (!disabled) {
super.onBackPressed();
}
}
With this you can easy change disable flag and enable back button when needed.
#Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if (keyCode == KeyEvent.KEYCODE_BACK) {
//leave it empty
}
return super.onKeyDown(keyCode, event);
}
It's generally not the best idea to disable the back button as the user expects that button to perform some sort of back navigation. Now that being said, if you have a specific reason you can disable the back button by overriding the onBackPressed at the activity level and not calling into super.
Put this code at your MainActivity:
#Override
public void onBackPressed() {
executeAtAndroidOnBackPressed();
}
#Override
public boolean onKeyDown(final int keyCode, final KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
executeAtAndroidOnBackPressed();
}
return false;
}
protected void executeAtAndroidOnBackPressed() {
// do nothing
}
For my main activity I have aproxximately 12 fragments that I want to switch between. For this first one I'm trying to use an OnTouchListener for the whole screen to switch the view. I'm currently trying to create a interface so that when I click the screen in this fragment the main activity will implement code to switch to a different view. this is what I have so far:
public class suggestedfriends extends Fragment{
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.search,
container, false);
view.setOnTouchListener(new View.OnTouchListener() {
#Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
return true;
}
});
return view;
}
public interface OnItemSelectedListener{
public void switchfirstscreen();
}
}
Help on this simplest fragment is greatly appreciated as it will help me implement code for the remaining eleven.
You could implement a method that recieves a Fragment instance as a paramenter and make the fragment transaction.
public void changeFragment(Fragment fragment){
if(null != fragment){
FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
ft.replace(R.id.container, fragment);
ft.addToBackStack(null);
ft.commit();
}
}
So in your onTouch method call you do something like:
#Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
changeFragment(new MyFragment);
return true;
}
Hope it helps.
Also read this: Fragments
Best Regards.
I have a webview inside fragment and I want it to be controlled by the navigation history whenever I press the back button.
In my case, when I press the back button I leave the webview, but I want that on pressing the button I will return to the state that is stored in the navigation history (from before leaving the webview).
Any solution please?
I tried with onKey but it does not resolve my problem. Here my code:
public class FragmentAll extends Fragment implements
DialogInterface.OnCancelListener, DialogInterface.OnDismissListener,
OnDownloaExpodTerminated {
public static Fragment newInstance(Context context) {
FragmentAll f = new FragmentAll();
return f;
}
private WebView myWebView;
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
(((MainActivity) getActivity()) ).setActionBarTitle("Store");
myWebView = (WebView) v.findViewById(R.id.webView1);
setWebview();
v.setOnKeyListener(new OnKeyListener() {
#Override
public boolean onKey(View arg0, int arg1, KeyEvent arg2) {
// TODO Auto-generated method stub
if (arg1 == KeyEvent.KEYCODE_BACK && myWebView.canGoBack()) {
myWebView.goBack();
return true;
}
return false;
}
});
return v;
}
...
}
You can try it
#Override
public void onBackPressed() {
if (mWebView.canGoBack()) {
mWebView.goBack();
return;
}
// Otherwise defer to system default behavior.
super.onBackPressed();
}
You will have to make a method inside your Fragment class:
public void goBackWebview(){
myWebview.goBack();
}
Now, go to the Activity class to which this fragment is attached and override the onBackPressed():
#Override
public void onBackPressed() {
//if webview has history
myFragment.goBackWebView();
}
you need to manage list of links is loaded in your webview.
you can get the url like this
web_des2.setOnTouchListener(new OnTouchListener() {
#Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
HitTestResult hitTestResult = web_des2.getHitTestResult();
if (hitTestResult != null) {
String url = hitTestResult.getExtra();
if (url != null && url.startsWith("http://")) {
yourUrlList.add(url);
web_des2.loadUrl(url);
}
}
return true;
}
return false;
}
});
you can check onBackPress if your list does not empty then get url form list and load it into webview and remove from the list.
you can use Stack to store url so become easy you can use pop() and push() function directly. if like than +1
Is there something I'm missing in this code?
Yes, I know this is mostly code, but IMHO I think it is clear.
Stil there seems to be more unnecessary text needed.
#Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState)
{
if(container == null) { return null; }
super.onCreateView(inflater, container, savedInstanceState);
final EditText editText = (EditText) outsideLayout.findViewById(R.id.prefPlayerName);
editText.setInputType(InputType.TYPE_TEXT_VARIATION_NORMAL);
editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
editText.setImeOptions(EditorInfo.IME_ACTION_GO);
editText.setOnKeyListener(new EditText.OnKeyListener()
{
#Override
public boolean onKey(View v, int keyCode, KeyEvent event)
{
// If the event is a key-down event on the "enter" key
if((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER))
{
Log.i(TAG, "PrefDetailsFragment enter key pressed");
return true;
}
return false;
}
});
return outsideLayout;
} // onCreateView()
Try moving editText outside of onCreateView and setting the listener in onResume as well. You may also want to remove the call to the super and to exit when the container is null.
#Override
protected void onResume() {
super.onResume();
if ( editText != null && ! editTexthasOnClickListeners() ) {
editText.setOnKeyListener( ... ); // Add on click listener here as well
}
}