I'm trying to show ads every few button presses, the first two times it works fine but it never gets to show a third.
Is my code wrong? I'm using Vscode and Android Studio.
This is the code I am using:
InterstitialAd _interstitialAd;
static bool _isInterstitialAdReady = false;
InterstitialAd _createInterstitialAd = new InterstitialAd(
adUnitId: Ads.interstitial,
listener: (MobileAdEvent event) {},
);
#override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback(_afterLayout);
FirebaseAdMob.instance.initialize(appId: Ads.appId);
_interstitialAd = InterstitialAd(
adUnitId: Ads.interstitial,
listener: (MobileAdEvent event) {
switch (event) {
case MobileAdEvent.loaded:
_isInterstitialAdReady = true;
break;
case MobileAdEvent.failedToLoad:
_isInterstitialAdReady = false;
break;
case MobileAdEvent.closed:
_interstitialAd.dispose();
_interstitialAd = _createInterstitialAd..load();
break;
default:
}
});
_interstitialAd.load();
}
#override
void dispose() {
// Add these to dispose to cancel timer when user leaves the app
_interstitialAd?.dispose();
super.dispose();
}
Call method:
if (ButtonCounter.rouletteCounter >= 10 && _isInterstitialAdReady) {
_interstitialAd
..load()
..show();
ButtonCounter.rouletteCounter = 0;
} else {
ButtonCounter.rouletteCounter++;
print('_isInterstitialReady: $_isInterstitialAdReady');
}
Related
Update:
It's playing well, but when finished playing it's not showing the play button. I have tried I couldn't get it well. Maybe I spiked something else were.
How can I show the play button when a player finished playing?
HomePage.xaml
<Button ImageSource="{Binding PlayIcon}"
Command="{Binding PlayCommand}"
HorizontalOptions="End"
VerticalOptions="End"/>
HomePage.xaml.cs
public HomePage()
{
InitializeComponent();
isPlaying = true;
}
private bool isPlaying;
public bool IsPlaying
{
get { return isPlaying; }
set
{
isPlaying = value;
OnPropertyChanged(nameof(PlayIcon));
}
}
public string PlayIcon { get => isPlaying ? "play.png" : "pause.png"; }
public ICommand PlayCommand => new Command(Play);
private async void Play()
{
if (isPlaying)
{
await CrossMediaManager.Current.Play("file:///android_asset/running.mp3");
IsPlaying = true; ;
}
else
{
await CrossMediaManager.Current.Pause();
IsPlaying = false; ;
}
}
Thank you for your contribution.
to play an asset, use this syntax
private async void PlayButtonClicked(object sender, EventArgs e)
{
// update the button's image
((Button)sender).ImageSource = ImageSource.FromFile("pause.png");
wait CrossMediaManager.Current.Play("file:///android_asset/long-test.mp3");
}
ref: https://github.com/Baseflow/XamarinMediaManager/issues/840
the docs contains a list of events supported by the control, including a MediaItemFinished event
In my program, in a service, I created a stopwatch (Label) that counts the time of loading data from DB.
Now, I want to pin the label to the appropriate table so I tried to use the bind method but it doesn't work.
Notice that I created in the FXML file test label, and it does work.
public class PutDataService extends Service {
CanvasTableView tableView;
Label labelTimer;
Timer timer;
public PutDataService(CanvasTableView canvasTableView) {
this.tableView = canvasTableView;
labelTimer = new Label("Time: ");
timer = new Timer();
Label testLabel = (Label) Controller.getInstance().getTarget().getAnchorPane().lookup("#testLabel");
testLabel.setManaged(false);
testLabel.layoutXProperty().bind(tableView.layoutXProperty());
testLabel.layoutYProperty().bind(tableView.layoutYProperty().subtract(20.0));
testLabel.toFront();
Platform.runLater(() -> {
Controller.getInstance().getTarget().getAnchorPane().getChildren().add(labelTimer);
labelTimer.setManaged(false);
labelTimer.layoutXProperty().bind(tableView.layoutXProperty());
labelTimer.layoutYProperty().bind(tableView.layoutYProperty().subtract(20.0));
labelTimer.toFront();
});
labelTimer.layoutXProperty().addListener((observableValue, number, t1) -> System.out.println(labelTimer.layoutXProperty().getValue()));//changed !
setOnSucceeded((EventHandler<WorkerStateEvent>) workerStateEvent -> {
//Unbind here
Controller.getInstance().getTarget().getAnchorPane().getChildren().remove(labelTimer);
timer.cancel();
timer.purge();
});
}
#Override
protected Task createTask() {
return new Task() {
#Override
protected Object call() throws Exception {
//Start the stop watch , counts every 1 sec
timer.schedule(new TimerTask() {
int i = 0;
#Override
public void run() {
Platform.runLater(() -> labelTimer.textProperty().setValue(getTimeMessage(i)));
i++;
}
}, 0, 1000);
tableView.putData();
return null;
}
};
}
}
What am I done wrong?
I need my web view to be tappable and scrolable. Once I implement on touch the scroll doesnt work. This way i managed to get it working however now i dont know how to make the web view tappable? the ButtonPress does nothing and if i use Move then i am just scrolling
This my my render in mu droid project
class ExtendedWebViewClient : WebViewClient
{
WebView _webView;
public async override void OnPageFinished(WebView view, string url)
{
try
{
_webView = view;
if (_xwebView != null)
{
view.Settings.JavaScriptEnabled = true;
await Task.Delay(100);
string result = await _xwebView.EvaluateJavaScriptAsync("(function(){return document.body.scrollHeight;})()");
_xwebView.HeightRequest = Convert.ToDouble(result);
}
base.OnPageFinished(view, url);
}
catch (Exception ex)
{
Console.WriteLine($"{ex.Message}");
}
}
public override bool ShouldOverrideUrlLoading(Android.Webkit.WebView view, IWebResourceRequest request)
{
return true;
}
}
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
{
base.OnElementChanged(e);
_xwebView = e.NewElement as ExtendedWebView;
_webView = Control;
if (e.OldElement == null)
{
_webView.SetWebViewClient(new ExtendedWebViewClient());
}
if (e.OldElement != null)
{
Control.Touch -= ControlOnTouch;
Control.ScrollChange -= ControlOnScrollChange;
}
if (e.NewElement != null)
{
Control.Touch += ControlOnTouch;
Control.ScrollChange += ControlOnScrollChange;
}
}
private void ControlOnScrollChange(object sender, ScrollChangeEventArgs scrollChangeEventArgs)
{
if (scrollChangeEventArgs.ScrollY > 0 && scrollChangeEventArgs.OldScrollY == 0)
{
Control.Parent.RequestDisallowInterceptTouchEvent(true);
}
}
private void ControlOnTouch(object sender, Android.Views.View.TouchEventArgs e)
{
// Executing this will prevent the Scrolling to be intercepted by parent views
switch (e.Event.Action)
{
case MotionEventActions.Down:
Control.Parent.RequestDisallowInterceptTouchEvent(true);
break;
case MotionEventActions.Up:
Control.Parent.RequestDisallowInterceptTouchEvent(false);
break;
case MotionEventActions.ButtonPress:
Console.WriteLine("press");
break;
case MotionEventActions.Mask:
Console.WriteLine("mask");
break;
}
// Calling this will allow the scrolling event to be executed in the WebView
Control.OnTouchEvent(e.Event);
}
Instead of using the gesture recognizer on your webview, you can use the Focused event like following . It will been invoked when you tap the WebView .
var wb = new WebView
{
HorizontalOptions = LayoutOptions.FillAndExpand,
VerticalOptions = LayoutOptions.FillAndExpand,
Source = "xxx",
};
wb.Focused += (sender, event) =>
{
//Handle your logic here!
wb.Unfocus();
};
Unfocus() is used if you want to implement your logic everytime the webview is tapped.
so i managed to get a stock navigation drawer to work and the action bar title to change with the fragments selected. I've also managed to get the backstack working easy peasy.
What i can't figure out how to do is get the action bar title to change back with the back click. google documentations says to add a onBackStackChangedListener:
getSupportFragmentManager().addOnBackStackChangedListener(
new FragmentManager.OnBackStackChangedListener() {
public void onBackStackChanged() {
// Update your UI here.
}
});
but i'm at a lost where to place it? they say when i .commit to changes so i assumed it was placed after
if (id == R.id.nav_spatial_awareness) {
setTitle("Spatial Awareness");
SpatialAwareness spatialAwarenessFragment = new SpatialAwareness();
android.support.v4.app.FragmentManager spatialAwarenessManager = getSupportFragmentManager();
spatialAwarenessManager.beginTransaction()
.addToBackStack(null)
.replace(R.id.main_content_layout, spatialAwarenessFragment, spatialAwarenessFragment.getTag())
.commit();
but that didn't work, this is what i tried and all i get is red squigglies
if (id == R.id.nav_spatial_awareness) {
setTitle("Spatial Awareness");
SpatialAwareness spatialAwarenessFragment = new SpatialAwareness();
android.support.v4.app.FragmentManager spatialAwarenessManager = getSupportFragmentManager();
spatialAwarenessManager.beginTransaction()
.addToBackStack(null)
.replace(R.id.main_content_layout, spatialAwarenessFragment, spatialAwarenessFragment.getTag())
.commit();
getSupportFragmentManager().addOnBackStackChangedListener(
new FragmentManager.OnBackStackChangedListener() {
public void onBackStackChanged() {
setTitle("Spatial Awareness");
}
});
please help me noob
so i tried this
if (id == R.id.nav_spatial_awareness) {
setTitle("Spatial Awareness");
final SpatialAwareness spatialAwarenessFragment = new SpatialAwareness();
android.support.v4.app.FragmentManager spatialAwarenessManager = getSupportFragmentManager();
spatialAwarenessManager.beginTransaction()
.addToBackStack(null)
.replace(R.id.main_content_layout, spatialAwarenessFragment, "spatialAwarenessFragmentTag")
.commit();
getSupportFragmentManager().addOnBackStackChangedListener(
new FragmentManager.OnBackStackChangedListener() {
public void onBackStackChanged() {
android.app.Fragment currentBackStackFragment = getFragmentManager().findFragmentByTag("spatialAwarenessFragmentTag");
if(currentBackStackFragment instanceof SpatialAwareness){
setTitle("Spatial");
}
}
});
i gave my fragment a tag and then tried matching the instance and then changing the title, still no good :(
Yes, the solution as mentioned here is to add a FragmentManager.OnBackStackChangedListener to your activity's FragmentManager.
Here is an example from a project I worked on:
(I have a navigation drawer with 7 Fragments and the OverviewFragment is the initial one that opens when the MainActivity opens)
My MainActivity:
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener, FragmentManager.OnBackStackChangedListener {
...
#Override
protected void onCreate(Bundle savedInstanceState) {
...
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
if (savedInstanceState == null) {
// open the default fragment
OverviewFragment fragment = new OverviewFragment();
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, fragment).commit();
setTitle(R.string.title_fragment_overview);
}
getSupportFragmentManager().addOnBackStackChangedListener(this);
}
#Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
Fragment fragment = null;
switch (item.getItemId()) {
case R.id.nav_overview:
fragment = new OverviewFragment();
break;
case R.id.nav_schedule:
fragment = new ScheduleFragment();
break;
case R.id.nav_all_tasks:
fragment = new AllTasksFragment();
break;
case R.id.nav_announcements:
fragment = new AnnouncementFragment();
break;
case R.id.nav_my_courses:
fragment = new MyCoursesFragment();
break;
case R.id.nav_map:
fragment = new MapFragment();
break;
case R.id.nav_settings:
fragment = new SettingsFragment();
break;
default:
fragment = new OverviewFragment();
}
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, fragment)
.addToBackStack(null)
.commit();
drawer.closeDrawer(GravityCompat.START);
return true;
}
#Override
public void onBackStackChanged() {
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment currentFragment =
fragmentManager.findFragmentById(R.id.fragment_container);
if (currentFragment instanceof OverviewFragment) {
setTitle(R.string.title_fragment_overview);
navigationView.getMenu().findItem(R.id.nav_overview).setChecked(true);
}
else if (currentFragment instanceof ScheduleFragment) {
setTitle(R.string.title_fragment_schedule);
navigationView.getMenu().findItem(R.id.nav_schedule).setChecked(true);
}
else if (currentFragment instanceof AllTasksFragment) {
setTitle(R.string.title_fragment_all_tasks);
navigationView.getMenu().findItem(R.id.nav_all_tasks).setChecked(true);
}
else if (currentFragment instanceof MyCoursesFragment) {
setTitle(R.string.title_fragment_my_courses);
navigationView.getMenu().findItem(R.id.nav_my_courses).setChecked(true);
}
else if (currentFragment instanceof AnnouncementFragment) {
setTitle(R.string.title_fragment_announcements);
navigationView.getMenu().findItem(R.id.nav_announcements).setChecked(true);
}
else if (currentFragment instanceof MapFragment) {
setTitle(R.string.title_fragment_map);
navigationView.getMenu().findItem(R.id.nav_map).setChecked(true);
}
else if (currentFragment instanceof SettingsFragment) {
setTitle(R.string.title_fragment_settings);
navigationView.getMenu().findItem(R.id.nav_settings).setChecked(true);
}
}
}
Here's the entire project: https://github.com/FCI-E-campus/fci-e-campus-android
I am trying to bind two separate event to scene in javafx .
scene.addEventHandler(MouseEvent.MOUSE_RELEASED, new EventHandler<Event>() {
#Override
public void handle(Event event) {
......Drag Content Task.......
}
});
So How can get this two Events any Suggestion.
scene.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
#Override
public void handle(MouseEvent event) {
if(event.getClickCount() == 2){
System.out.println("Call Dbl Click Eve");
Zooming....Task.....
}
});
I wrote some code and it works for me !
Using Current Time calculate time betwwen two click events if it less than dblclick expected then consider double click..
scene.addEventHandler(MouseEvent.ANY, e -> {
if (e.getEventType().equals(MouseEvent.DRAG_DETECTED)) {
System.out.println("Drag Event call ");
drag_Flag=true;
}
if (e.getEventType().equals(MouseEvent.MOUSE_RELEASED) && drag_Flag) {
System.out.println("Rellease Event call");
drag_Flag=false;
System.out.println("Drag Event Flag : "+drag_Flag);
time1=0;
time2=0;
} else if (e.getEventType().equals(MouseEvent.MOUSE_CLICKED) && !drag_Flag) {
long diff = 0;
if(time1==0)
time1=System.currentTimeMillis();
else
time2=System.currentTimeMillis();
if(time1!=0 && time2!=0)
diff=time2-time1;
if((diff/1000)<=215 && diff>0)
{
isdblClicked=true;
}
else
{
isdblClicked=false;
}
System.out.println("IsDblClicked()"+isdblClicked);
if(isdblClicked==true)
{
ZoomInOutPojo z = null;
do_Zoom();
time1=time2=0;
isdblClicked=false;
}
else
{
statement1;
}
}
drag_Flag=false;
}
});
Solution Works for My Case.
static boolean drag_Flag=false
scene.addEventHandler(MouseEvent.ANY, e -> {
if (e.getEventType().equals(MouseEvent.DRAG_DETECTED)) {
System.out.println("Drag Event call ");
drag_Flag=true;
}
if (e.getEventType().equals(MouseEvent.MOUSE_RELEASED) && drag_Flag) {
System.out.println("Rellease Event call");
drag_Flag=false;
System.out.println("Drag Event Flag : "+drag_Flag);
time1=0;
time2=0;
} else if (e.getEventType().equals(MouseEvent.MOUSE_CLICKED) && !drag_Flag) {
long diff = 0;
if(time1==0)
time1=System.currentTimeMillis();
else
time2=System.currentTimeMillis();
if(time1!=0 && time2!=0)
diff=time2-time1;
if((diff/1000)<=215 && diff>0)
{
isdblClicked=true;
}
else
{
isdblClicked=false;
}
System.out.println("IsDblClicked()"+isdblClicked);
if(isdblClicked==true)
{
ZoomInOutPojo z = null;
do_Zoom();
time1=time2=0;
isdblClicked=false;
}
else
{
statement1;
}
}
drag_Flag=false;
}
});
Well the way you posted it should already work, another way to do it would be:
scene.addEventHandler(MouseEvent.ANY, e -> {
if (e.getEventType().equals(MouseEvent.MOUSE_RELEASED)) {
// do something
} else if (e.getEventType().equals(MouseEvent.MOUSE_CLICKED)) {
// do something else
}
});
You can use the following code too. Try it.
EventHandler<MouseEvent> clickEvent = new EventHandler<MouseEvent>() {
#Override
public void handle(MouseEvent event) {
if(event.getClickCount() == 2){
System.out.println("Call Dbl Click Eve");
}
}
};
EventHandler<MouseEvent> releaseEvent = new EventHandler<MouseEvent>() {
#Override
public void handle(MouseEvent event) {
System.out.println("Rele");
}
};
scene.addEventHandler(MouseEvent.MOUSE_CLICKED, clickEvent);
scene.addEventHandler(MouseEvent.MOUSE_RELEASED, releaseEvent);
I hope it will help you.