can we call startActivityForResult from adapter?How to get the response? - android

is it possible to have method startActivtyForResult within an adapter?Then how to get the response? Where to execute the call back function?

Yes, it's possible. You need a reference for the Context in the adapter and call the activity:
Intent intent = new Intent(context, TargetActivity.class);
((Activity) context).startActivityForResult(intent, REQUEST_FOR_ACTIVITY_CODE);
Beware that context must be an activity context or this code will fail.
You get the result in the enclosing activity using onActivityResult as usual.
So, for example:
In your adapter:
MyAdapter(Context context) {
mContext = context;
}
public View getView(int position, View convertView, ViewGroup parent) {
…
open.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
…
Activity origin = (Activity)mContext;
origin.startActivityForResult(new Intent(mContext, SecondActivity.class), requestCode);
}
});
…
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("MyAdapter", "onActivityResult");
}
In your second activity, do as usual with setResult and finish.
In your main activity, capture the result and pass to the adapter callback:
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
mAdapter.onActivityResult(requestCode, resultCode, data);
}

Yes.You can call startactivityforresult() from adapter.
There are two case-
1.Calling adapter from activity and need onActivityResult in activity.
2.Calling adapter from Fragment and need onActivityResult in fragment.
Case 1:Get OnActivityResult in Activity then pass the reference of activity to adapter constructor
public MyAdapter(Activity pActivity, List<MyBean> pList) {
mList = pList;
mActivity = pActivity;
}
Now startActivityForResult
Intent intent = new Intent(context, TargetActivity.class);
mActivity.startActivityForResult(intent, REQUEST_FOR_ACTIVITY_CODE);
Case 2: Get OnActivityResult in Fragment then pass the reference of fragment to adapter constructor
public MyGamesAdapter(Fragment pContext, List<MyBean> pList,) {
mList = pList;
mMyFragment =pContext;
}
Intent intent = new Intent(context, TargetActivity.class);
mMyFragment.startActivityForResult(intent, REQUEST_FOR_ACTIVITY_CODE);
Now in activity or fragment override OnActivityResult and get result.
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
mAdapter.onActivityResult(requestCode, resultCode, data);
}

I used a simpler method. create a public function in you activity/fragment which will call activity for result
public void startActivityFromAdapter(String Arguments){
//todo: add steps you would like to compute
startActivityForResult(Intent, REQ_CODE);
}
When creating the adapter, pass the current activity/fragment as an argument. I will use activity for example
public MyAdaper(Activity activity, ArrayList<String> list){
this.activity = activity;
this.list = list;
}
call the public function from viewholder by casting the activity to the Activity Class
#Override
public void onBindViewHolder(#NonNull ViewHolder holder, int position) {
holder.applyBt.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
((ActivityName) activity).startActivityFromAdapter(list.get(position).code);
}
});
}
and use onActivityResult in your calling activity/fragment
Edit:
I would not recommend using above method as it limits the adapter to be used in only one activity. Better you must use an interface for the same
create an interface and a onClickFunction
public interface AdapterInteface{
void onBtClick(int Position)
}
now when you create the adapter, accept this interface as an argument and call the function when button is clicked
public MyAdaper(Activity activity, ArrayList<String> list, AdapterInterface adapterInterface){
this.activity = activity;
this.list = list;
this.adapterInterface = adapterInterface
}
#Override
public void onBindViewHolder(#NonNull ViewHolder holder, int position) {
holder.applyBt.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
adapterInterface.onBtClicked(position)
}
});
}
Implement this interface on your activity/fragment and override the function onBtClicked on your activity/fragment to startActivityForResult

write a functon in activity class like this
public void startCommentActivity(Intent i){
startActivityForResult(i, 100);
}
call it in adapter class
mActivity.startCommentActivity(intent);

The androidX Activity implementation has a new set of APIs to get an activity result anywhere you wish.
This functionality replaces the old startActivityForResult() / onActivityResult() and onRequestPermissionsResult(), which have been deprecated in the ComponentActivity.
Example starting a second activity and expecting a result from it:
final Intent intent = new Intent(context, SecondActivity.class);
final ActivityResultContracts.StartActivityForResult contract = new ActivityResultContracts.StartActivityForResult();
activity.registerForActivityResult(contract, result ->
YourClass.manageTheResult(result))
.launch(intent);
Example requesting user permissions:
final String[] permissions = {Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO};
final ActivityResultContracts.RequestMultiplePermissions contract = new ActivityResultContracts.RequestMultiplePermissions();
activity.registerForActivityResult(contract, result -> {
YourClass.manageTheResult(permissions, result);
}).launch(permissions);
Example managing a "sender intent":
final IntentSenderRequest request = new IntentSenderRequest.Builder(yourIntentSender)
.build();
final ActivityResultContracts.StartIntentSenderForResult contract = new ActivityResultContracts.StartIntentSenderForResult();
activity.registerForActivityResult(contract, result ->
YourClasss.manageTheResult(result))
.launch(request);

Related

refresh RecyclerView from another Activity After add a value

I have a MainActivity with tabhost , tabhost has three tab(Fragment) . SecondTab has a RecyclerView . In MainActivity, use the ActionBar button to go to another activity(NewClass) and add new values(MainActivity is still open) . After adding new values, I want to go back to MainActivity and refresh the RecyclerView to display new values.
I am using reactToPublishedEvent() method to refresh RecyclerView but doesnt work.
I could not solve my problem with using answers .
MainActivity
public class MainActivity extends AppCompatActivity implements Publisher{
private Listener listener;
protected void onCreate(Bundle savedInstanceState) {
//. . .
public void onClick(View view)
{
Intent intent = new Intent();
intent.setClass(this , NewClass.class);
startActivityForResult(intent , 1);
}
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 1 && resultCode == RESULT_OK)
{
if(data != null)
{
listener.reactToPublishedEvent();
}
}
}
#Override
public void setListener(SecondTab listener) {
this.listener = listener;
}
interface Listener{
void reactToPublishedEvent();
}}
NewClass
boolean check = database.SaveClass(className, classDay, classTimeStart, classTimeEnd, Integer.parseInt(classNumber), uniName , checkMidTerm , checkEndTerm , checkPractical , checkProject , checkConference);
if(check)
{
Intent intent = new Intent();
setResult(RESULT_OK , intent);
finish();
}
SecondTab :
public class SecondTab extends Fragment implements MainActivity.Listener{
private RecyclerView recyclerView;
private DatabaseHandler database;
private RecyclerViewAdapter recyclerAdapter;
private List<ClassTable> classData;
#Nullable
#Override
public View onCreateView(final LayoutInflater inflater, #Nullable ViewGroup container, #Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_second_tab, container, false);
database = new DatabaseHandler(getContext());
recyclerView = view.findViewById(R.id.recyclerView_SecondTab);
classData = new ArrayList<>();
prepareAdapter();
return view;
}
private void prepareAdapter()
{
classData = database.getClassData();//Receive table data
recyclerAdapter = new RecyclerViewAdapter(this , getContext(), classData);
recyclerView.setAdapter(recyclerAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
}
#Override
public void onAttach(Context context) {
super.onAttach(context);
if(context instanceof Publisher){
((Publisher)context).setListener(this);
}
}
#Override
public void reactToPublishedEvent() {
recyclerAdapter.notifyDataSetChanged();//this line is not correct
}
Publisher
public interface Publisher {
void setListener(SecondTab listener);}
I recommend you to use Publisher/Listener pattern.
Publisher - publish some event. Listener react to this events.
So you need to create two interfaces:
interface Publisher{
void setListener(Listener listener)
}
And
interface Listener{
void reactToPublishedEvent()
}
Your MainActivity is publisher. It emmit some events, so your MainActivity should be updated:
class MainActivity extends AppCompatActivity implements Publisher{
private Listener listener;
... // Some your code here
#Ovveride
public void setListener(Listener listener){
this.listener = listener
}
}
Your SecondTab is Listener and should be updated as:
public class SecondTab extends Fragment implements AlertDialogShowClass.OnItemChange, Listener{
... //Your code here
#Ovveride
public void onAttach(Context context){
//Set this fragment in activity as Listener
if(context instance of Publisher){
((Publisher)context).setListener(this)
}
}
}
Then in onActivityResult method you can write something like this:
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 1 && resultCode == RESULT_OK)
{
if(data != null && listener!=null)
{
listener.reactToPublishedEvent()
}
}
}
There are two way
1.Local broadcast manager
2.Interface
Few methods to achieve the problem.
Observer Pattern.
Local BroadcastManager.
Directly update from the Fragment.
First and second methods are already described in above answers. So will describe the the third one.
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 1 && resultCode == RESULT_OK)
{
if(data != null)
{
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment);
if (fragment instanceof SecondTab)
{
((SecondTab)fragment).recyclerView.notifyDataSetChanged();
// Any Notify method as the requirement
}
}
}
}
Hope This will help.
Cheers!!

How to get data from fragment to parent activity & pass it to back activity?

How flow goes?
Activity 1 -----> Activity 2 (containing/inside) ------> Fragment
WhatI want to achieve?
Fragment (sends some data back to Activity 2) ----> Activity 2 (onBackPressed : collects that data & send it back to Activity 1) ---> Activity 1
How should I achieve above. I really don't want to use any variables/constants to cache the fragment data. Need to know any in-built method to handle this?
Moreover,
Activity 2 loads Fragment inside it.
In onBackPressed, I'm using setResult in Activity 2 to do standard data passing using startActivityForResult from Activity 1.
Also, if I write any method inside Fragment & call from Activity 2 using then due to that to/fro process a WHITE screen appears. So, really don't want to write own method & need to manage it while leaving the Fragment.
You should start Activity2 with startActivityForResult as below;
Intent i = new Intent(this, Activity2.class);
startActivityForResult(i, requestCode);
And in Activity2/fragment, you should finish acitivity as below;
Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
getActivity().setResult(Activity.RESULT_OK,returnIntent);
getActivity().finish()
And get result in Activity1 as below;
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (this.requestCode == requestCode) {
if(resultCode == Activity.RESULT_OK){
//Get result
}
}
}
Hope it helps.
To pass data from Activity 2 to Activity 1 you can use startActivityForResult() in Activity 1 to start Activity 2, and onActivityResult() in Activity 1 to receive that data.
To pass data from Fragment to Activity 2, I'd suggest to use some interface like
interface OnSomeDataListener {
void onSomeData(SomeData data);
}
Then implement a setter method for this interface to a fragment like
public void setOnSomeDataListener(OnSomeDataListener listener) {
this.listener = listener;
}
And then in Activity, when instantiating a Fragment:
YourFragment fragment = new YourFragment();
fragment.setOnSomeDataListener(new OnSomeDataListener() {
void onSomeData(SomeData data) {
//return the result
Intent intent = new Intent();
intent.putExtra("data", data);
setResult(RESULT_OK, intent);
finish();
}
}
And finally, in the fragment, when you want to return some data to Activity:
if(listener != null) {
listener.onSomeData(dataToReturn);
}
From your FirstActivity call the SecondActivity using startActivityForResult() method
Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);
In your SecondActivity set the data which you want to return back to FirstActivity onBackPressed of SecondActivity.
#Override
public void onBackPressed() {
super.onBackPressed();
Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
returnIntent.putExtra("bool",true);
setResult(Activity.RESULT_OK,returnIntent);
finish();
}
Now in your FirstActivity class write following code for the onActivityResult() method.
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if(resultCode == Activity.RESULT_OK){
String result=data.getStringExtra("result");
boolean bool = data.getBooleanExtra("bool");
}
if (resultCode == Activity.RESULT_CANCELED) {
//Write your code if there's no result
}
}
}//
To send data from Fragment to Second activity, you can use interface callback
public interface sendDataListener
{
void sendData(boolean foo);
}
Implement this listener to Second activity
Try to do this:
public class MyFragment extends Fragment{
private MyFragmentCommunicator myFragmentCommunicator;
....
myFragmentCommunicator.sendDataToActivity(name, image, isSend);
#Override
public void onAttach(Activity activity) {
super.onAttach(activity);
myFragmentCommunicator = (MyFragmentCommunicator)activity;
}
}
then declare your interface:
public interface MyFragmentCommunicator{
void sendDataToActivity(String name, String image, boolean isSend);
}
and then in your Activity do this:
public class MyActivity extends AppCompatActivity implements MyFragmentCommunicator{
#Override
public void sendDataToActivity(String name, String image, String price) {
//Manipulate the data
}
}
Hope it helps!!!
i acheived in Following way
In Activity write setters and getters
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
and in Fragment
filePath = ((YourActivity) getActivity()).getFilePath();
fileName=((YourActivity) getActivity()).getFileName();
if You are Using Same Fragment in More Than 1 Activity You can Create a constructor for that fragment and Pass context and check context is of which activity
public class BookmarkFragment extends Fragment {
private String filePath;
private String fileName;
Context contextCheckClass;
public BookmarkFragment(Context ctx ) {
this.contextCheckClass=ctx;
}
#SuppressLint("InflateParams")
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
group= (View)inflater.inflate(R.layout.fragment_bookmark, null);
if(contextCheckClass instanceof FirstReaderScreen){
filePath = ((FirstReaderScreen) getActivity()).getFilePath();
fileName=((FirstReaderScreen) getActivity()).getFileName();
// ispurchased=((FirstReaderScreen) getActivity()).isIspurchased();
}
else if(contextCheckClass instanceof MainReaderScreen){
filePath = ((MainReaderScreen) getActivity()).getFilePath();
fileName=((MainReaderScreen) getActivity()).getFileName();
// ispurchased=((MainReaderScreen) getActivity()).isIspurchased();
}
return group;
}
for calling fragment
BookmarkFragment bookmarkFragment=new BookmarkFragment(FirstReaderScreen.this);
getSupportFragmentManager()
.beginTransaction()
.add(R.id.LL_Fragment, bookmarkFragment)//LL_fragment is container
.addToBackStack(null)
.commit();

Refresh Recyclerview from another Activity

I have my main Activity with a fragment, which has a Recyclerview retrieving all the data populated from the database. In this fragment I got a button which calls another activity to insert an object into the database.
The problem is when the Activity ends and returns to the Main Activity the Recyclerview doesn't show the new item I just created. I tried with this piece of code:
#Override
public void onResume() {
super.onResume();
adapterItem.addItem(MyApplication.getWritableDatabase().getAllItems());
listProjectsView.scrollToPosition(0);
}
The function getAllItems retrieve all the data from sqlite.
On my adapterItem from my Recyclerview I got this:
public void addItem(ArrayList<Item> listItems) {
this.listItems = listItems;
notifyItemInserted(0);
}
It works "fine". The main problem is when I switch to another application in progress in my mobile and I return to my developed app the onResume method switches on and show again my last insert, populating twice this item (and so on if I do it again).
Thanks
Pass the new item back to MainActivity, then deal with it yourself.
1.In MainActivity, use startActivityForResult to start the second Activity, like this:
startActivityForResult(new Intent(this, SecondActivity.class), REQUEST_CODE);
REQUEST_CODE is an int.
2.In second Activity, override finish like this:
#Override
public void finish() {
Intent returnIntent = new Intent();
returnIntent.putExtra("passed_item", itemYouJustCreated);
// setResult(RESULT_OK);
setResult(RESULT_OK, returnIntent); //By not passing the intent in the result, the calling activity will get null data.
super.finish();
}
3.In MainActivity, override onActivityResult like this:
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
YourItem passedItem = data.getExtras().get("passed_item");
// deal with the item yourself
}
}
You can create static recyclerview (let say mRecyclerview) in the activity(let say firstActivity) which displays your recyclerview .
And when you add new item to your list in the other activity(let say secondActivity), you can just use
firstActivity.mRecyclerview.getAdapter().notifyDataSetChanged();
I use this way for a while and didn't encounter any performance drawback but test it with your own code for sure.
If it may help someone...
I had the same:
"I have my MainActivity with a fragment, which has a RecyclerView retrieving all the data populated from the database. In this fragment, I got a button that calls another activity(insertA) to insert an object into the database.
The problem was when the activity(insertA) ends and returns to the Main Activity the RecyclerView doesn't show the new item I just created."
So I used this in Fragment button which calls another activity(insertA) I just called
btn_addNew.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Intent myIntent = new Intent(context, insertA.class);
startActivity(myIntent);
}
});
WITHOUT FINISHING with finish(); !!!!!!!!!!!!
In insertA Activity in the method AddNewThingToTheDataBase() insted of finish(); or startActivity(Intent); just put onBackPressed();
public void AddNewThingToTheDataBase(){
*****Inserting in DB code;
onBackPressed();
}
And in Main Activity add this code
#Override
public void onResume() {
super.onResume();
*YourUpdateRecyleViewFunction();*
}
Try Like this,
Intent intent = new Intent(Context, YourClass);
startActivityForResult(intent, ADD_ITEM);
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
if (requestCode == ADD_ITEM){
adapterItem.addItem(MyApplication.getWritableDatabase().getAllItems());
listProjectsView.scrollToPosition(0);
}
}
}
hope it will work for you
You can make the recyclerView static and initialize it in onCreate method
public class MainActivity extends AppCompatActivity {
protected static RecyclerView recyclerView;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.notes_recycler_view);
displayDataOnRecyclerView(this);
}
Then create a method in MainActivity to display the data in the recyclerView
public static void displayDataOnRecyclerView(Context context) {
//using a Linear Layout Manager
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(context);
recyclerView.setLayoutManager(layoutManager);
//data that will be displayed in the adapter from sqlite database
DatabaseHandler databaseHandler = new DatabaseHandler(context);
List<Model> data = databaseHandler.getAllData();
//specifying the adapter
RecyclerView.Adapter adapter = new RecyclerViewAdapter(data,context);
recyclerView.setAdapter(adapter);
}
Finally, call the displayDataOnRecyclerView method in the other Activity
MainActivity.displayDataOnRecyclerView(otherActivity.this);

How to refresh previous fragment after closing an activity?

I have a fragment that throws an activity in which user can insert some details.
When the user terminate to fill data the activity close. Then the previous fragment is showed and I want it to be updated (with the data provided by user in the activity).
If it was an activity, instead of fragment, i could use this:
#Override
public void onResume(){
super.onResume();
recreate();
}
How to do the same with fragment?
You would override onResume in the Activity which this Fragment belong, and recreate (restarted) this Fragment in this Activity. For example
public class ActivityA extends Activity {
#Override
public void onResume() {
// here you can get the Fragment instance , so you can recreated this fragment here or invoke this fragment's function to set data or refresh data
}
}
You can throw an Activity in calling startActivityForResult (Intent intent, int requestCode) method in your fragment.
also you need to provide onActivityResult (int requestCode, int resultCode, Intent data) in your fragment,the data is in the Intent parameter.
public class YourFragment extends Fragment {
public void throwActivity() {
// start activity
Intent intent = new Intent();
intent.setClass(getActivity(), YourActivity.class);
int requestCode = 1;
startActivityForResult(intent,requestCode);
}
// callback
#Override
public void onActivityResult (int requestCode, int resultCode, Intent data) {
recreate();
}
public void recreate() {
// your refresh code
}
}
public class YourActivity extends Activity {
public void yourMethod() {
int resultCode = 2;
setResult(resultCode); // goback to your fragment with your data
}
}

How to call startactivityforresult from a non-activity class to get the resuts

Is it possible to call startActivityForResult() from a non-activity class to get the results?
Scenario is something like this:
I have a class NonActivity (it doesn't derive from Activity as its not a UI).
This class will have bunch of functions(steps basically) to run.
One of the steps requires to show UI(Activity) and then get the result (user enter something).
Then been able to use that data in next following steps.
How can this be achieved without deriving from activity class as I don't have UI component?
Also since I don't want to derive from activity class that means I cannot override OnActivityResult(). Where results actually come from?
startActivityForResult() is only available from real on-screen activities, since it is a method in, well, Activity. Please redesign your application so that the user interface is driven from activities.
On the other hand, if your non Activity class is initialized and used from an onscreen Activity, you could pass that instance of the Activity to your class as a parameter in the constructor and use it to launch other Activities.
Be careful though. Using this method increases the risk of a memory leak, as the external class (Utils in my example) might keep a reference to the Activity even after its gone.
If all you want to do is access data, then you could try writing it to SharedPreferences or a Database or some files and then using the application context (passed in via a constructor again) to read it. This reduces the risk of a memory leak. Something like:
MyApiClass myApiClass = new MyApiClass(getApplicationContext());
EXAMPLE CODE
Main Activity:
public class Main extends FragmentActivity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Utils util = new Utils(this);
util.startTest();
}
#Override
protected void onActivityResult(int arg0, int arg1, Intent arg2) {
Toast.makeText(this, "onActivityResult called", Toast.LENGTH_LONG).show();
super.onActivityResult(arg0, arg1, arg2);
}
}
Utils class (which launches for result):
public class Utils {
Activity activity;
public Utils(Activity ac) {
activity = ac;
}
public void startTest() {
Intent i = new Intent(activity, Test.class);
activity.startActivityForResult(i, 1);
}
}
Test Activity:
public class Test extends FragmentActivity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Toast.makeText(this, "Test", Toast.LENGTH_LONG).show();
this.setResult(Activity.RESULT_OK);
this.finish();
}
}
StartActivityForResult from a class using a fragment with no visible GUI. You might find something like this in a utility class.
see runGetUserAccount below. It creates its own fragment and executes a startActivityForResult. Then it has it's own onActivityResult.
public class MyGooglePlay {
private static final int CONNECTION_FAILURE_RESOLUTION_REQUEST = 31502;
private ActionBarActivity activity;
private FragmentManager fragManager;
public MyGooglePlay(ActionBarActivity activity) {
this.activity = activity;
this.fragManager = activity.getSupportFragmentManager();
}
/**
* Starts an activity in Google Play Services so the user can pick an
* account
*/
private String mEmail = "";
static final int REQUEST_CODE_PICK_ACCOUNT = 1000;
public void runGetUserAccount() {
if (TextUtils.isEmpty(mEmail)) {
// run this code in gui less fragment so we can pickup the
// on activity result from inside the mygoogleplay class.
Fragment f = new Fragment() {
#Override
public void onAttach(Activity activity) {
super.onAttach(activity);
String[] accountTypes = new String[] { "com.google" };
Intent intent = AccountPicker.newChooseAccountIntent(null,
null, accountTypes, false, null, null, null, null);
startActivityForResult(intent, REQUEST_CODE_PICK_ACCOUNT);
}
#Override
public void onActivityResult(int requestCode, int resultCode,
Intent data) {
if (requestCode == REQUEST_CODE_PICK_ACCOUNT) {
if (resultCode == Activity.RESULT_OK) {
set_Email(data
.getStringExtra(AccountManager.KEY_ACCOUNT_NAME));
// getUsername();
}
super.onActivityResult(requestCode, resultCode, data);
}
//this is to verify the fragment has been removed.
//you can log or put a breakpoint to verify
#Override public void onDestroy(){
super.onDestroy();
}
};
FragmentTransaction fragmentTransaction = this.fragManager
.beginTransaction();
fragmentTransaction.add(f, "getusername");
fragmentTransaction.commit();
}
}
/**
* #param mEmail
* the mEmail to set
*/
private void set_Email(String mEmail) {
this.mEmail = mEmail;
if (!TextUtils.isEmpty(mEmail)) {
// TODO notify caller email is ready;
// activity.onEmailReady(mEmail);
}
//we are done with the "getusername" fragment
Fragment f = fragManager.findFragmentByTag("getusername");
if (f!=null) {
fragManager.beginTransaction().remove(f).commit();
}
}
}
U should pass context as Activity,then u will get solution.
try this below code.it will work
In non Activity class
public class nonActivity {
public static void method(Activity activity)
{
Intent intent = new Intent(activity, SecondActivity.class);
activity. startActivityForResult(intent, REQUEST_CODE);
}
}
In SecondActivity
Intent intent = getIntent();
intent.putExtra("data", "data"); //here u can pass data to previous activity
setResult(RESULT_OK, intent);
finish();
In firstActivity
protected void onActivityResult(int requestCode, int resultCode, #Nullable Intent data) {
try {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
String status = data.getStringExtra("data");
//Do what u want with data
}
} catch (Exception e) {
System.out.println("=====Exception=====" + e.toString());
}
}
If you want the result back from the activity to your normal class, supposed it is a class with a custom adapter within it.
you cannot use startActivityForResult because you are not in an activity
what I did is that i launched the activity from the class with an intent. Then I calculated or did what I have to. From this activity I send the information to the main class supposed with a method MainActivity.the_method() and in the main activity I changed the custom adapter o did what I have to using the adapter object and calling adapter.getItem(position)
Hope this can give you an idea

Categories

Resources