Android ViewModel, update LiveData inside a timer - javascript

I would like to have count down timer in my mobile app, I have used ViewModel and LiveData to share the data between different activities and update the UI. I know the ViewModel & LiveData is working as I have a button which saves the data, but when I try the same from the timer I get the following error:
Your activity is not yet attached to the Application instance. You can't request ViewModel before onCreate call.
I think the "model = new ViewModelProvider(this).get(viewmodelclass.class);" is wrong, but I have tried to delay the timer before calling the ViewModel class so it has time to initialise all the variables. So not sure how to get the reference to the ViewModel class?
Any ideas how to fix this issue would be highly appreciated, as it seems a very simple but going around in circles trying to fix it.
MainActivity class
package com.example.viewmodellivedata_sandpit;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity
{
private Button buttonBack_activity;
public viewmodelclass model;
#Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Get a reference to the ViewModel
model = new ViewModelProvider(this).get(viewmodelclass.class);
LiveData<String> shoppingList = model.getshoppinglist();
model.getshoppinglist().observe(this, new Observer<String>(){
#Override
public void onChanged(#Nullable String s)
{
Log.d("Debug", "String has been updated");
}
});
TextView textView_1 = findViewById(R.id.textView1);
buttonBack_activity = (Button) findViewById(R.id.button1);
buttonBack_activity.setOnClickListener(new View.OnClickListener()
{
#Override
public void onClick(View view) {
Log.d("Debug", "Button pressed");
model.writedatatest("send text");
}
});
TimerStateMachineClass mActivity= new TimerStateMachineClass();
mActivity.starttimer();
}
}
ViewModel class
package com.example.viewmodellivedata_sandpit;
import android.util.Log;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class viewmodelclass extends ViewModel {
public MutableLiveData<String> shoppingList;
public MutableLiveData<String> getshoppinglist() {
if (shoppingList == null) {
Log.w("Debug", "Inside the get shopping list");
shoppingList = new MutableLiveData<>();
writedatatest("test message");
}
return shoppingList;
}
public void writedatatest(String incomingdata)
{
Log.w("Debug", "Inside the get shopping list 1 -> "+shoppingList.getValue());
shoppingList.postValue(incomingdata);
}
}
Timer class
public class TimerStateMachineClass extends AppCompatActivity {
public Timer myTimer;
public viewmodelclass model;
int coutner;
public void starttimer()
{
Log.w("Debug", "onCreate savedInstanceState");
model = new ViewModelProvider(this).get(viewmodelclass.class);
Log.w("Debug", "Function start timer");
myTimer = new Timer();
coutner = 0;
myTimer.schedule(new TimerTask() {
public void run() {
TimerMethod();
}
}, 0, 1000);
}
public void TimerMethod()
{
Log.w("Debug", "Timer execution");
// LiveData<String> shoppingList = model.getshoppinglist();
coutner++;
model.writedatatest(Integer.toString(coutner));
}
}

The answer was very simple just need to add onCreateView at the bottom of the code
public class MainActivity extends AppCompatActivity
{
private Button buttonBack_activity;
TextView textView_1;
public static viewmodelclass model;
#Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Get a reference to the ViewModel
model = new ViewModelProvider(this).get(viewmodelclass.class);
try{
textView_1 = findViewById(R.id.textView1);
buttonBack_activity = (Button) findViewById(R.id.button1);
buttonBack_activity.setOnClickListener(new View.OnClickListener()
{
#Override
public void onClick(View view) {
Log.d("Debug", "Button pressed");
model.writedatatest("send text");
}
});
TimerStateMachineClass mActivity= new TimerStateMachineClass();
mActivity.starttimer();
LiveData<String> shoppingList = model.getshoppinglist();
model.getshoppinglist().observe(this, new Observer<String>(){
#Override
public void onChanged(#Nullable String s)
{
textView_1.setText(s);
Log.d("Debug", "String has been updated ->"+s);
}
});
}catch (Exception e)
{
e.printStackTrace();
}
}
#Nullable
#Override
public View onCreateView(#NonNull String name, #NonNull Context context,
#NonNull AttributeSet attrs) {
return super.onCreateView(name, context, attrs);
}
}

Related

Intent to Navigation Drawer Activity not working

I have been trying to add a Navigation Drawer Activity to my code, I followed an old tutorial that upon creation didn't create fragments, but I tried to make ti work none the less, I think I did everything right but when opening then emulator, the app doesn't take me to the activity but to the launcher one(?), is it the emulator or is it the code?
Navigation Drawer:
public class NavigationDrawerActivity extends AppCompatActivity {
private AppBarConfiguration mAppBarConfiguration;
FirebaseDatabase database;
DatabaseReference category;
TextView txtFullName;
RecyclerView recyclerView;
RecyclerView.LayoutManager layoutManager;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_navigation_drawer);
Toolbar toolbar = findViewById(R.id.toolbar);
toolbar.setTitle("Options");
setSupportActionBar(toolbar);
//Init. Firebase
database = FirebaseDatabase.getInstance();
category = database.getReference("Category");
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
DrawerLayout drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
mAppBarConfiguration = new AppBarConfiguration.Builder(
R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow)
.setDrawerLayout(drawer)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(navigationView, navController);
//Set name for User
View HeaderView = navigationView.getHeaderView(0);
txtFullName = findViewById(R.id.txtFullName);
if (Common.currentUser != null) {
txtFullName.setText(Common.currentUser.getName());
finish();
} else if (Common.CurrentFirebaseUser != null) {
txtFullName.setText(Common.CurrentFirebaseUser.getDisplayName());
finish();
}
//Load Options
recyclerView = findViewById(R.id.recycler);
recyclerView.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
loadFilter();
}
private void loadFilter() {
FirebaseRecyclerAdapter<Category,FilterViewHolder> adapter = new FirebaseRecyclerAdapter<Category, FilterViewHolder>(Category.class, R.layout.filter_item, FilterViewHolder.class, category) {
#Override
protected void populateViewHolder(FilterViewHolder filterViewHolder, Category category, int i) {
FilterViewHolder.txtFilterName.setText(category.getName());
Picasso.with(getBaseContext()).load(category.getImage())
.into(filterViewHolder.imageView);
Category clickItem = category;
filterViewHolder.setItemClickListener(new ItemClickListener() {
#Override
public void onClick(View view, int position, boolean isLongClick) {
Toast.makeText(NavigationDrawerActivity.this, ""+ clickItem.getName(), Toast.LENGTH_SHORT).show();
}
});
}
};
recyclerView.setAdapter(adapter);
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.navigation_drawer, menu);
return true;
}
#Override
public boolean onSupportNavigateUp() {
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
return NavigationUI.navigateUp(navController, mAppBarConfiguration)
|| super.onSupportNavigateUp();
}
}
SignIn leading to the Navigation Drawer (ignore the login logic):
public class SignIn extends AppCompatActivity {
private static final int RC_SIGN_IN = 1;
Button btnSignIn;
ImageView btnGoogle;
EditText edtTxtPhone, edtTxtPassword;
private static final String TAG = "SignIn";
private FirebaseAuth mAuth;
private boolean noError = false;
private GoogleSignInClient mGoogleSignInClient;
#Override
protected void onStart() {
super.onStart();
FirebaseUser user = mAuth.getCurrentUser();
if (user != null) {
Intent intent = new Intent(SignIn.this, NavigationDrawerActivity.class);
startActivity(intent);
}
}
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_in);
btnSignIn = findViewById(R.id.btnSignIn);
btnGoogle = findViewById(R.id.btnGoogle);
edtTxtPhone = findViewById(R.id.edtTxtPhone);
edtTxtPassword = findViewById(R.id.edtTxtPassword);
//Initialize Firebase
FirebaseDatabase database = FirebaseDatabase.getInstance("https://app-delivery-tutorial-default-rtdb.europe-west1.firebasedatabase.app");
DatabaseReference table_user = database.getReference("User");
btnSignIn.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
checkCredentials();
ProgressDialog mDialog = new ProgressDialog(SignIn.this);
mDialog.setMessage("Signin In...");
mDialog.show();
if (noError) {
table_user.addListenerForSingleValueEvent(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot snapshot) {
mDialog.dismiss();
//Check If User Does Exist First
if (snapshot.child(edtTxtPhone.getText().toString()).exists()) {
//Get User Information
User user = snapshot.child(edtTxtPhone.getText().toString()).getValue(User.class);
if (user.getPassword().equals(edtTxtPassword.getText().toString())) {
Intent successfulLogIn = new Intent(SignIn.this, NavigationDrawerActivity.class);
Common.currentUser = user;
startActivity(successfulLogIn);
} else {
Toast.makeText(SignIn.this, "Sign In Failed", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(SignIn.this, "User Not Found, Please Register First", Toast.LENGTH_SHORT).show();
Log.w(TAG, "Failed to read value.");
}
}
#Override
public void onCancelled(#NonNull DatabaseError error) {
Toast.makeText(SignIn.this, "Cancelled", Toast.LENGTH_SHORT).show();
}
});
} else {
mDialog.dismiss();
Toast.makeText(SignIn.this, "Wrong Phone Number Or Password Input", Toast.LENGTH_SHORT).show();
}
}
});
//Initialize Google Firebase
mAuth = FirebaseAuth.getInstance();
createRequestGoogle();
btnGoogle.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
SignInGoogle();
}
});
}
#Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
try {
GoogleSignInAccount account = task.getResult(ApiException.class);
firebaseAuthWithGoogle(account);
Toast.makeText(this, "Activity Has Been Succesful", Toast.LENGTH_SHORT).show();
} catch (ApiException e) {
Log.w(TAG, "Google Sign In Failed", e);
}
}
}
private void firebaseAuthWithGoogle(GoogleSignInAccount account) {
AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(), null);
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
#Override
public void onComplete(#NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
FirebaseUser user = mAuth.getCurrentUser();
Intent intent = new Intent(SignIn.this, NavigationDrawerActivity.class);
Common.CurrentFirebaseUser = user;
startActivity(intent);
}
}
});
}
private void SignInGoogle() {
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
}
private void createRequestGoogle() {
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
}
private void checkCredentials() {
String username = edtTxtPhone.getText().toString();
String password = edtTxtPassword.getText().toString();
if (username.isEmpty() || username.length() < 9) {
showError(edtTxtPhone, "Your Phone Number must have at least 9 character");
} else if (password.isEmpty() || password.length() < 4) {
showError(edtTxtPassword, "Your password must have at least 4 character");
} else {
noError = true;
}
}
private void showError(EditText editText, String s) {
editText.setError(s);
editText.requestFocus();
}
}
I tried to see if the fragments created were the problem, if the NavigationDrawerActivity should use an other xml file or if I was missing some logic, but I still don't understand why it would take me to the Launcher Activity instead of the NavigationDrawer one, the SignIn logic does work with other activities other than the NavigationDrawer one

Call php script inside java activity after click

I am parsing a JSON title, URL etc. from a PHP script. I want to give a reward with PHP script after the user click my link. Reward code -
String awr = Config.Base_Url+"videos/award.php";
Now everything is working, there is just no reward, no call to my PHP script...
How do i need modify my script to get correct reward? My java activity -
package com.uabclousy.pjanidemo;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import org.json.JSONArray;
import java.util.ArrayList;
import com.android.volley.Request;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.uabclousy.pjanidemo.app.App;
import com.uabclousy.pjanidemo.constants.Constants;
import org.json.JSONException;
import org.json.JSONObject;
import android.net.Uri;
import android.content.Intent;
public class ItemsActivity extends BaseActivity {
private PrefManager prf;
List<DataAdapter> ListOfdataAdapter;
RecyclerView recyclerView;
String HTTP_JSON_URL = "https://pjani.com/ImageJsonData.php";
String Image_Name_JSON = "image_title";
String Image_Decription_JSON = "app_description";
String Image_URL_JSON = "image_url";
String App_URL_JSON = "app_url";
String App_Message_JSON = "app_message";
String App_Points = "app_points";
String App_Id = "videoId";
String App_sec = "id";
public static final String EXTRA_VIDEO_ID = "id";
public static final String EXTRA_ID = "id";
JsonArrayRequest RequestOfJSonArray ;
RequestQueue requestQueue ;
View view ;
int RecyclerViewItemPosition ;
RecyclerView.LayoutManager layoutManagerOfrecyclerView;
RecyclerView.Adapter recyclerViewadapter;
ArrayList<String> ImageTitleNameArrayListForClick;
ArrayList<String> AppmessageArrayListForClick;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_items);
prf = new PrefManager(this);
getSupportActionBar().setIcon(R.drawable.ic_back_icon);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
ImageTitleNameArrayListForClick = new ArrayList<>();
AppmessageArrayListForClick = new ArrayList<>();
ListOfdataAdapter = new ArrayList<>();
recyclerView = (RecyclerView) findViewById(R.id.recyclerview1);
recyclerView.setHasFixedSize(true);
layoutManagerOfrecyclerView = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManagerOfrecyclerView);
JSON_HTTP_CALL();
validate();
// Implementing Click Listener on RecyclerView.
recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
GestureDetector gestureDetector = new GestureDetector(ItemsActivity.this, new GestureDetector.SimpleOnGestureListener() {
#Override public boolean onSingleTapUp(MotionEvent motionEvent) {
return true;
}
});
#Override
public boolean onInterceptTouchEvent(RecyclerView Recyclerview, MotionEvent motionEvent) {
view = Recyclerview.findChildViewUnder(motionEvent.getX(), motionEvent.getY());
if(view != null && gestureDetector.onTouchEvent(motionEvent)) {
//Getting RecyclerView Clicked Item value.
RecyclerViewItemPosition = Recyclerview.getChildAdapterPosition(view);
// Showing RecyclerView Clicked Item value using Toast.
Toast.makeText(ItemsActivity.this, AppmessageArrayListForClick.get(RecyclerViewItemPosition), Toast.LENGTH_LONG).show();
String url = ImageTitleNameArrayListForClick.get(RecyclerViewItemPosition);
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.putExtra("points", App_Points);
intent.putExtra("vid", App_Id);
intent.putExtra("id", App_sec);
intent.putExtra("yourreq4", "fuck13");
setResult(RESULT_OK, intent);
finish();
startActivity(intent);
}
return false;
}
#Override
public void onTouchEvent(RecyclerView Recyclerview, MotionEvent motionEvent) {
}
#Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
});
}
void award_items(final String points, final String tostore, final String type){
String awr = Config.Base_Url+"videos/award.php";
final String v1 ="1";
final String v0 ="0";
final String v2 ="2";
StringRequest stringRequest = new StringRequest(Request.Method.POST, awr,
new Response.Listener<String>() {
#Override
public void onResponse(String response) {
//Enable this only on testing - yash
//Toast.makeText(VideosActivity.this, response, Toast.LENGTH_LONG).show();
if(response.intern() == v1.intern()) {
Toast.makeText(ItemsActivity.this, points+" "+getString(R.string.points_received), Toast.LENGTH_SHORT).show();
prf.setBoolean(tostore, true);
Intent intent = getIntent();
finish();
startActivity(intent);
}
if(response.intern() == v0.intern()) {
Toast.makeText(ItemsActivity.this, getString(R.string.already_watched), Toast.LENGTH_SHORT).show();
prf.setBoolean(tostore, true);
Intent intent = getIntent();
finish();
startActivity(intent);
}
if(response.intern() == v2.intern()){
Toast.makeText(ItemsActivity.this,getString(R.string.server_problem),Toast.LENGTH_SHORT).show();
}
}
},
new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(ItemsActivity.this,getString(R.string.server_problem),Toast.LENGTH_SHORT).show();
}
}){
#Override
protected Map<String,String> getParams(){
Map<String,String> params = new HashMap<String, String>();
params.put("username", App.getInstance().getUsername());
params.put("points",App_Points);
params.put("type",type);
params.put("videoid",Image_Name_JSON);
params.put("date","hehe");
return params;
}
};
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_about, menu);
return true;
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
this.finish();
break;
case R.id.share:
shareURL();
return true;
default:
return super.onOptionsItemSelected(item);
}
return true;
}
// sharing
void shareURL() {
try
{ Intent i = new Intent(Intent.ACTION_SEND);
i.setType("text/plain");
i.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.app_name));
String sAux = getString(R.string.share_text)+"\n";
sAux = sAux + "https://play.google.com/store/apps/details?id="+getApplicationContext().getPackageName()+"\n";
i.putExtra(Intent.EXTRA_TEXT, sAux);
startActivity(Intent.createChooser(i, getString(R.string.choose_one)));
}
catch(Exception e)
{ //e.toString();
}
}
public void JSON_HTTP_CALL(){
RequestOfJSonArray = new JsonArrayRequest(HTTP_JSON_URL,
new Response.Listener<JSONArray>() {
#Override
public void onResponse(JSONArray response) {
ParseJSonResponse(response);
}
},
new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
}
});
requestQueue = Volley.newRequestQueue(ItemsActivity.this);
requestQueue.add(RequestOfJSonArray);
}
public void ParseJSonResponse(JSONArray array){
for(int i = 0; i<array.length(); i++) {
DataAdapter GetDataAdapter2 = new DataAdapter();
JSONObject json = null;
try {
json = array.getJSONObject(i);
GetDataAdapter2.setImageTitle(json.getString(Image_Name_JSON));
GetDataAdapter2.setImageDescription(json.getString(Image_Decription_JSON));
// Opening link in array to display on RecyclerView click event.
ImageTitleNameArrayListForClick.add(json.getString(App_URL_JSON));
// Adding message in array to display on RecyclerView click event.
AppmessageArrayListForClick.add(json.getString(App_Message_JSON));
GetDataAdapter2.setImageUrl(json.getString(Image_URL_JSON));
GetDataAdapter2.setAppPoints(json.getString(App_Points));
} catch (JSONException e) {
e.printStackTrace();
}
ListOfdataAdapter.add(GetDataAdapter2);
}
recyclerViewadapter = new RecyclerViewAdapter(ListOfdataAdapter, this);
recyclerView.setAdapter(recyclerViewadapter);
}
void validate(){
if (Config.Base_Url.intern() == Constants.API_License && !BuildConfig.DEBUG && Constants.release) {
App.getInstance().logout();
Intent i = new Intent(getApplicationContext(), AppActivity.class);
startActivity(i);
finish();
ActivityCompat.finishAffinity(ItemsActivity.this);
}
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1) {
if(resultCode == RESULT_OK) {
award_items(data.getStringExtra("points"),data.getStringExtra("id"),getString(R.string.webpanel_credit));
// Toast.makeText(getApplicationContext(), data.getStringExtra("id"), Toast.LENGTH_SHORT).show();
}
}
}
}
Thank you very much for helping!

GWT Cannot read property 'example' of undefined

I'm learning GWT and currently I'm struggeling with RPC. I have a simple Project: a Label, a Textbox, an outputLabel and a Button.
I want when the user enters his Name in the TextBox and press the "send" Button he will get a Message from the Server "Hello "+name+"Here speaks the Server" - stupid example.
However in my CLient I have a package GUI and a Package Service and my entrypoint class
public class TestGwt270 implements EntryPoint {
public void onModuleLoad()
{
TestGwt270ClientImpl clientImpls = new TestGwt270ClientImpl("/TestGwt270/testgwt270service");
GWT.log("Main "+GWT.getModuleBaseURL() );
RootPanel.get().add(clientImpls.getMainGUI());
}
MyGui:
public class MainGUI extends Composite
{
private TestGwt270ClientImpl serviceImpl;
private VerticalPanel vPanel;
private TextBox inputTB;
private Label outputLbl;
public MainGUI(TestGwt270ClientImpl serviceImpl)
{
this.vPanel = new VerticalPanel();
initWidget(vPanel);
this.inputTB = new TextBox();
this.inputTB.setText("Gib deinen Namen ein");
this.outputLbl = new Label("Hier kommt der output");
this.vPanel.add(this.inputTB);
this.vPanel.add(this.outputLbl);
Button sendBtn = new Button("send");
sendBtn.addClickHandler(new MyClickhandler());
this.vPanel.add(sendBtn);
}
public void updateOutputLbl(String output)
{
this.outputLbl.setText(output);
}
private class MyClickhandler implements ClickHandler
{
#Override
public void onClick(ClickEvent event) {
// TODO Auto-generated method stub
serviceImpl.sayHello(inputTB.getText());
}
}
}
TheService:
#RemoteServiceRelativePath("testgwt270service")
public interface TestGwt270Service extends RemoteService
{
String sayHello(String name);
}
AsyncService:
public interface TestGwt270ServiceAsync
{
void sayHello(String name, AsyncCallback<String> callback);
}
ClientInterface:
public interface TestGwt270ServiceClientInt
{
void sayHello(String name);
}
Client Implementation:
public class TestGwt270ClientImpl implements TestGwt270ServiceClientInt
{
private TestGwt270ServiceAsync service;
private MainGUI maingui;
public TestGwt270ClientImpl(String url)
{
GWT.log(url);
// TODO Auto-generated constructor stub
this.service = GWT.create(TestGwt270Service.class);
ServiceDefTarget endpoint = (ServiceDefTarget) this.service;
endpoint.setServiceEntryPoint(url);
this.maingui = new MainGUI(this);
}
public MainGUI getMainGUI()
{
return this.maingui;
}
#Override
public void sayHello(String name) {
// TODO Auto-generated method stub
this.service.sayHello(name, new MyCallback());
}
private class MyCallback implements AsyncCallback<String>
{
#Override
public void onFailure(Throwable arg0) {
// TODO Auto-generated method stub
GWT.log("Failure");
maingui.updateOutputLbl("An Error has occured");
}
#Override
public void onSuccess(String arg0) {
// TODO Auto-generated method stub
GWT.log("Success");
maingui.updateOutputLbl(arg0);
}
}
}
ServerSideCode:
public class TestGwt270ServiceImpl extends RemoteServiceServlet implements TestGwt270Service
{
#Override
public String sayHello(String name) {
// TODO Auto-generated method stub
GWT.log("Hello " + name + "\nHier spricht der Server mit dir");
return "Hello " + name + "\nHier spricht der Server mit dir";
}
}
My Problem is, when I press the Button to send my Name to the server I get following Error:
HandlerManager.java:129 Uncaught com.google.gwt.event.shared.UmbrellaException: Exception caught: (TypeError) : Cannot read property 'sayHello_2_g$' of undefined
I don't know where this Error comes from and I hope you can help me.
I found the answer myself - I made a simple mistake:
In the class MyGUI I got this:
public class MainGUI extends Composite
{
private TestGwt270ClientImpl serviceImpl;
...
public MainGUI(TestGwt270ClientImpl serviceImpl)
{
...
I forgot to assign the serviceImpl
the Fix:
public class MainGUI extends Composite
{
private TestGwt270ClientImpl serviceImpl;
...
public MainGUI(TestGwt270ClientImpl serviceImpl)
{
this.serviceImpl = serviceImpl; //this line is the solution to my problem
...

How to start New Layout (activity) from ListView

When I click the ListView, I'd like to start a new Activity
Here is my MainActivity.java
package com.theheran.listviewicon;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends Activity {
//Declarasi Array Menu dan gambar
ListView list;
String[] menu = {
"#The_Heran",
"www.theheran.com",
"Add",
"Delete",
"Next",
"Back",
"Find",
"Warning"
} ;
Integer[] imageId = {
R.drawable.ic_launcher,
R.drawable.signal,
R.drawable.add,
R.drawable.trash,
R.drawable.next,
R.drawable.back,
R.drawable.find,
R.drawable.warning
};
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CustomListView adapter = new
CustomListView(MainActivity.this, menu, imageId);
list=(ListView)findViewById(R.id.list);
list.setAdapter(adapter);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
Toast.makeText(MainActivity.this, "You Clicked at " +menu[+ position], Toast.LENGTH_SHORT).show();
// HERE THE PROBLEM (Intent)
Intent intent = new CustomListView(MainActivity.this,);
startActivity(intent);
}
});
}
}
My CustomListView
package com.theheran.listviewicon;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class CustomListView extends ArrayAdapter<String> {
//Declarasi
private final Activity context;
private final String[] web;
private final Integer[] imageId;
public CustomListView(Activity context,String[] web, Integer[] imageId) {
super(context, R.layout.list_single_data, web);
this.context = context;
this.web = web;
this.imageId = imageId;
}
#Override
public View getView(int position, View view, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
//Load Custom Layout untuk list
View rowView= inflater.inflate(R.layout.list_single_data, null, true);
//Declarasi komponen
TextView txtTitle = (TextView) rowView.findViewById(R.id.txtList);
ImageView imageView = (ImageView) rowView.findViewById(R.id.imgIcon);
//Set Parameter Value
txtTitle.setText(web[position]);
imageView.setImageResource(imageId[position]);
return rowView;
}
}
// HERE THE PROBLEM (Intent)
Intent intent = new CustomListView(MainActivity.this,);
startActivity(intent);
Here you are trying to use a wrong structure.
Use this:
Intent intent = new Intent(MainActivity.this, NextActivity.class);
MainActivity.this.startActivity(intent );
Try this way ,
list.setOnItemClickListener(new OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Toast.makeText(MainActivity.this, "You Clicked at " +position , Toast.LENGTH_SHORT).show();
Intent MoveToNext = new Intent(getApplicationContext(), Your_Next_Activity.class);
startActivity(MoveToNext);
}
});
This is how I have done it. You start a new activity using the startActivityForResult(intent, 2); Where you throw a intent and a number (number that you check for when you go back to the starting page).
private void registerButtonClickList() {
ListView list = (ListView) findViewById(R.id.listView);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(InThisClass.this, GoingToThisClass.class);
intent.putExtra("Position", position);
startActivityForResult(intent, 0);
}
});
}
Use this where in the same class as you started the other one form the list. This is needed since you are expecting a return when you start with startActivityForResult()
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0) {
if (resultCode == Activity.RESULT_OK) {
//See what u should do using the requestCode
//and check if it ended OK
}
if (resultCode == Activity.RESULT_CANCELED) {
//what you do when canceled
}
}
}
And in the activity that you started you need to end with this because you are expected to return something. This you do by using setResult().
Button btn = (Button) findViewById(R.id.btn);
btnCANCEL.setOnClickListener(new View.OnClickListener() {
#TargetApi(Build.VERSION_CODES.CUPCAKE)
#Override
public void onClick(View v) {
Intent intent = new Intent();
setResult(Activity.RESULT_OK, intent);
//intent.putExtra("something", something); if you need to send something back
finish();
}
});
Hope this helps!

convert activity into fragment that can call activity

i have problem to convert activity to fragment, but function of "getBaseContext" and "this" can't work
package prj.apdev.c17;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
public class DataBase extends Fragment {
TempatDatabase dm;
EditText inama, idosis, ilabel;
Button btambah;
TableLayout tabel4data;
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View va = inflater.inflate(R.layout.mapping_fragment, container, false);
return va;
dm = new TempatDatabase(this);
tabel4data = (TableLayout) va.findViewById (R.id.tabel_data);
inama = (EditText) va.findViewById(R.id.dose_nama_e);
idosis = (EditText) va.findViewById(R.id.dose_dosis_e);
ilabel = (EditText) va.findViewById(R.id.dose_label_e);
btambah = (Button) va.findViewById(R.id.button_add);
btambah.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
// TODO Auto-generated method stub
simpanData();
}
});
updateTable();
}
private void updateTable() {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
while (tabel4data.getChildCount() > 1) {
tabel4data.removeViewAt(1);
}
double aa = tabel4data.getChildCount();
String a = String.valueOf(aa);
Toast.makeText(getBaseContext(), "tabel data child : " + a,
Toast.LENGTH_SHORT).show();
ArrayList<ArrayList<Object>> data = dm.ambilSemuaBaris();//
for (int posisi = 0; posisi < data.size(); posisi++) {
TableRow tabelBaris = new TableRow(this);
ArrayList<Object> baris = data.get(posisi);
TextView idTxt = new TextView(this);
idTxt.setText(baris.get(0).toString());
tabelBaris.addView(idTxt);
TextView namaTxt = new TextView(this);
namaTxt.setText(baris.get(1).toString());
tabelBaris.addView(namaTxt);
TextView dosisTxt = new TextView(this);
dosisTxt.setText(baris.get(2).toString());
tabelBaris.addView(dosisTxt);
TextView labelTxt = new TextView(this);
labelTxt.setText(baris.get(3).toString());
tabelBaris.addView(labelTxt);
tabel4data.addView(tabelBaris);
}
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private void simpanData() {
// TODO Auto-generated method stub
try {
dm.addRow(inama.getText().toString(), idosis.getText().toString(), ilabel.getText().toString());
Toast.makeText(getBaseContext(), inama.getText().toString() + ", berhasil disimpan",
Toast.LENGTH_SHORT).show();
updateTable();
kosongkanField();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(getBaseContext(), "gagal simpan, " + e.toString(),
Toast.LENGTH_LONG).show();
}
}
private void kosongkanField() {
// TODO Auto-generated method stub
inama.setText("");
idosis.setText("");
ilabel.setText("");
}
}
and this my database class
package prj.apdev.c17;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import java.util.ArrayList;
public class TempatDatabase {
private static final String ROW_ID = "_id";
private static final String ROW_NAMA = "nama";
private static final String ROW_DOSIS = "dosis";
private static final String ROW_LABEL = "label";
private static final String NAMA_DB ="APdev";
private static final String NAMA_TABEL="Doseme";
private static final int DB_VERSION=1;
private static final String CREATE_TABLE =
"create table "+NAMA_TABEL+" ("+ROW_ID+" integer PRIMARY KEY autoincrement, "+ROW_NAMA+" text,"+ROW_DOSIS+" text, "+ROW_LABEL+" text)";
//membuat mendeklarasikan itu adalah context
private final Context context;
//membuat mendeklarasikan DatabaseOpenHelper itu adalah dbhelper
private DatabaseOpenHelper dbhelper;
//membuat mendeklarasikan SQLiteDatabase itu adalah db
private SQLiteDatabase db;
//mengambil context untuk mengakses system di android
public TempatDatabase(DataBase ctx) {
//mendeklarasikan ctx adalah context ( context context di ganti ctx )
this.context = ctx;
// membuat DatabaseOpenHelper
dbhelper = new DatabaseOpenHelper(context);
//menuliskan DatabaseOpenHelper = SQLiteDatabase
db = dbhelper.getWritableDatabase();
}
private static class DatabaseOpenHelper extends SQLiteOpenHelper {
//membuat database
public DatabaseOpenHelper(Context context) {
super(context, NAMA_DB, null, DB_VERSION);
// TODO Auto-generated constructor stub
}
#Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(CREATE_TABLE);
}
//memperbarui database bila sudah ada
#Override
public void onUpgrade(SQLiteDatabase db, int oldVer, int newVer) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS "+NAMA_DB);
onCreate(db);
}
}
//menutup DatabaseOpenHelper
public void close() {
dbhelper.close();
}
//menambahkan pada row
public void addRow(String nama, String dosis, String label) {
ContentValues values = new ContentValues();
values.put(ROW_NAMA, nama);
values.put(ROW_DOSIS, dosis);
values.put(ROW_LABEL, label);
try {
//menambahkan nama tabel bila tidak akan error
// db.delete(NAMA_TABEL, null, null);
db.insert(NAMA_TABEL, null, values);
} catch (Exception e) {
Log.e("DB ERROR", e.toString());
e.printStackTrace();
}
}
//membuat array pada table layout
public ArrayList<ArrayList<Object>> ambilSemuaBaris() {
ArrayList<ArrayList<Object>> dataArray = new ArrayList<ArrayList<Object>>();
Cursor cur;
try {
cur = db.query(NAMA_TABEL,
new String[] { ROW_ID, ROW_NAMA, ROW_DOSIS, ROW_LABEL }, null, null,
null, null, null);
cur.moveToFirst();
if (!cur.isAfterLast()) {
do {
ArrayList<Object> dataList = new ArrayList<Object>();
dataList.add(cur.getLong(0));
dataList.add(cur.getString(1));
dataList.add(cur.getString(2));
dataList.add(cur.getString(3));
dataArray.add(dataList);
} while (cur.moveToNext());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.e("DEBE ERROR", e.toString());
}
return dataArray;
}
}
or if you have any method for complete this condition, you can include it.
Thanks
You can use getActivity().getBaseContext, which returns the activity associated with a fragment.
your context type is DataBase in your TempatDatabase constructor. Change it with Context i.e
public TempatDatabase(Context ctx) {
//mendeklarasikan ctx adalah context ( context context di ganti ctx )
this.context = ctx;
// membuat DatabaseOpenHelper
dbhelper = new DatabaseOpenHelper(context);
//menuliskan DatabaseOpenHelper = SQLiteDatabase
db = dbhelper.getWritableDatabase();
}
and for the fragment getActivity() method wil return the context
Problem Resolved
I've realize that function "return" must be on the end of part
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View va = inflater.inflate(R.layout.dose_fragment, container, false);
dm = new TempatDatabase(getActivity());
tabel4data = (TableLayout) va.findViewById(R.id.tabel_data);
inama = (EditText) va.findViewById(R.id.dose_nama_e);
idosis = (EditText) va.findViewById(R.id.dose_dosis_e);
ilabel = (EditText) va.findViewById(R.id.dose_label_e);
btambah = (Button) va.findViewById(R.id.button_add);
btambah.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
// TODO Auto-generated method stub
simpanData();
}
});
updateTable();
return va;
}
Thanks for helping guys.

Categories

Resources