एक टुकड़ा से एक गतिविधि शुरू करो


91

मैं दोनों टुकड़ों के साथ एक बटन पर 2 टुकड़े हैं। जब मैं बटन दबाता हूं तो मैं एक नई गतिविधि शुरू करना चाहता हूं। लेकिन मैं इसे काम नहीं कर सकता।

जो त्रुटि मुझे मिल रही है: ERROR यहाँ: प्रकार बेमेल: mFragmentFavorite से Fragment में परिवर्तित नहीं हो सकता

मैं क्या गलत कर रहा हूं?

MyFragmentPagerAdapter

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

public class MyFragmentPagerAdapter extends FragmentPagerAdapter{

    final int PAGE_COUNT = 3;

    /** Constructor of the class */
    public MyFragmentPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    /** This method will be invoked when a page is requested to create */
    @Override
    public Fragment getItem(int arg0) {

        switch(arg0){

        case 0:
            return new FavoriteActivity();
                    //ERROR: Type mismatch: cannot convert from FavoriteActivity to Fragment


        case 1:
            return new SettingsActivity();


        default:
            return null;

        }       
    }

    /** Returns the number of pages */
    @Override
    public int getCount() {
        return PAGE_COUNT;
    }
}

पसंदीदा गतिविधि

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;

public class FavoriteActivity extends Activity{

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.main_favorite, container, false);


        OnClickListener listnr=new OnClickListener() {
            @Override
            public void onClick(View v) {
                  Intent i= new Intent("aFavorite");
                  startActivity(i);
            }
        };

          Button btn =(Button) v.findViewById(R.id.mainFavorite);
          btn.setOnClickListener(listnr);

          return v;
    }
}

अगर फेवरेट एक्टिविटी के टुकड़े होते हैं, तो त्रुटि दूर हो जाती है, लेकिन फिर मुझे एक त्रुटि मिलती है findViewById(R.id.mainFavorite);और वह त्रुटि है

इस प्रकार की विधि ViewBBIId (int) पसंदीदाएक्टिविटी के लिए अपरिभाषित है

संपादित करें:

जब मैं गतिविधि शुरू करने के लिए टुकड़े में बटन दबाता हूं तो ऐप क्रैश हो जाता है यह मेरा लॉगकैट है

03-18 16:01:23.985: E/AndroidRuntime(1985): FATAL EXCEPTION: main
03-18 16:01:23.985: E/AndroidRuntime(1985): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=FavoriteActivityList }
03-18 16:01:23.985: E/AndroidRuntime(1985):     at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1569)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1420)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at android.app.Activity.startActivityForResult(Activity.java:3446)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at android.app.Activity.startActivityForResult(Activity.java:3407)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at android.support.v4.app.FragmentActivity.startActivityFromFragment(FragmentActivity.java:826)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at android.support.v4.app.Fragment.startActivity(Fragment.java:838)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at com.example.spui.FavoriteActivity$1.onClick(FavoriteActivity.java:24)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at android.view.View.performClick(View.java:4211)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at android.view.View$PerformClick.run(View.java:17267)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at android.os.Handler.handleCallback(Handler.java:615)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at android.os.Handler.dispatchMessage(Handler.java:92)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at android.os.Looper.loop(Looper.java:137)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at android.app.ActivityThread.main(ActivityThread.java:4898)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at java.lang.reflect.Method.invokeNative(Native Method)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at java.lang.reflect.Method.invoke(Method.java:511)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at dalvik.system.NativeStart.main(Native Method)

3
शायद आपको FragmentActivity का विस्तार नहीं करना चाहिए, बल्कि Fragment का?
अवधि

1
ठीक है, एक के लिए आप उपयोग नहीं कर रहे हैं Fragments। आपके द्वारा पोस्ट किए गए कोड में कम से कम नहीं।
adneal

जवाबों:


247

mFragmentFavoriteअपने कोड में एक है FragmentActivityजो एक के रूप में एक ही बात नहीं है Fragment। इसलिए आपको टाइप मिसमैच हो रहा है। इसके अलावा, आप फोन कभी नहीं करना चाहिए newएक पर Activityके रूप में है कि उचित तरीके से एक शुरू करने के लिए नहीं है।

यदि आप एक नया उदाहरण शुरू करना चाहते हैं mFragmentFavorite, तो आप ऐसा कर सकते हैं Intent

एक से Fragment:

Intent intent = new Intent(getActivity(), mFragmentFavorite.class);
startActivity(intent);

एक से Activity

Intent intent = new Intent(this, mFragmentFavorite.class);
startActivity(intent);

यदि आप aFavoriteइसके बजाय शुरू करना चाहते हैं , mFragmentFavoriteतो आपको केवल उनके नाम को बदलने की जरूरत है Intent

साथ ही, मैं आपकी कक्षा के नाम को और अधिक सटीक होने की सलाह देता हूं। किसी चीज mFragmentFavoriteको कॉल करना अनुचित है क्योंकि यह बिल्कुल भी नहीं है Fragment। इसके अलावा, जावा में वर्ग घोषणाएं आमतौर पर एक बड़े अक्षर से शुरू होती हैं। आप अपनी कक्षा का नाम कुछ FavoriteActivityऔर बेहतर होना चाहते हैं और भाषा सम्मेलनों के अनुरूप होना चाहिए। अगर आपको ऐसा करने का विकल्प चुनना है, तो आपको फ़ाइल को नाम बदलने की जरूरत होगी।

अपडेट करें

इसके अलावा, ऐसा लगता है कि आप वास्तव में के लिए mFragmentFavoriteएक होने की Fragmentबजाय एक FragmentActivityके आपके उपयोग के आधार पर onCreateView। यदि आप चाहते हैं mFragmentFavoriteहोने के लिए एक Fragmentतो कोड की निम्न पंक्ति को बदलने:

public class mFragmentFavorite extends FragmentActivity{

इसे पढ़ने के बजाय बनाएं:

public class mFragmentFavorite extends Fragment {

ठीक है, मैं पहली पोस्ट में कोड अपडेट करूंगा। लेकिन मैं mContextReference को काफी नहीं समझता। मेरे पास मेरे और बेहतर नामों के साथ कोड अपडेट होगा, मुझे
mXX

यह एक Fragmentया एक के संदर्भ का एक उदाहरण है Activity। आप उन वर्गों में से एक के कोड के अंदर का उपयोग कर रहे हैं तो आप सिर्फ जगह ले सकता है mContextReferenceके साथ या तो getActivity()के लिए Fragmentया thisके लिए Activityपहली पंक्ति पर और thisदूसरी पंक्ति के लिए। मैं उत्तर को अधिक स्पष्ट होने के लिए अपडेट करूंगा।
माइकल सीली

ठीक है, मैंने बेहतर नामों और आपके द्वारा मुझे दी गई सलाह से प्रश्न को अपडेट किया। कोशिश करने और इसे काम करने के लिए आपके सुझाव को लागू करने के लिए मैं अभी कोशिश करूँगा मदद के लिए धन्यवाद
mx

हाँ, मैंने इसे वापस फ्रैगमेंट में बदल दिया है, लेकिन मुझे आईडी खोजने के लिए btn पर त्रुटि मिली "विधि findViewById (int) पसंदीदा के लिए अपरिभाषित है प्रकार"
पसंदीदाता

2
यदि आप इसे एक Fragmentपरिवर्तन findViewByIdकरते हैं v.findViewById। कोई findViewByIdफ़ंक्शन नहीं है Fragmentइसलिए आपको getViewपहले कॉल findViewByIdकरना होगा फिर उस पर कॉल करना होगा। हालांकि आपके मामले में, आपके पास पहले से ही अपना दृष्टिकोण है onCreateViewऔर वह आपका परिवर्तनशील होगा v
माइकल सीली

20

आपको getActivity()टुकड़ों से गतिविधियों को लॉन्च करने के लिए उपयोग करना चाहिए

Intent intent = new Intent(getActivity(), mFragmentFavorite.class);
startActivity(intent);

इसके अलावा, आपको कैप्स के साथ कक्षाओं का नामकरण करना चाहिए: MFragmentActivityइसके बजाय mFragmentActivity


4

यदि आप getActivity () का उपयोग कर रहे हैं, तो आपको यह सुनिश्चित करना होगा कि कॉलिंग गतिविधि पहले से ही जोड़ी गई है । यदि गतिविधि को ऐसे मामले में नहीं जोड़ा गया है, तो आपको getActivity () कहते समय अशक्त हो सकता है

ऐसे मामलों में getContext () सुरक्षित है

फिर गतिविधि शुरू करने का कोड थोड़ा बदल जाएगा,

Intent intent = new Intent(getContext(), mFragmentFavorite.class);
startActivity(intent);

गतिविधि, सेवा और अनुप्रयोग ContextWrapper वर्ग का विस्तार करते हैं ताकि आप पहले तर्क के स्थान पर इस या getContext () या getApplicationContext () का उपयोग कर सकें ।


'यदि आप getActivity () का उपयोग कर रहे हैं, तो आपको यह सुनिश्चित करना होगा कि कॉलिंग गतिविधि पहले से ही जोड़ दी गई है।' - इस पंक्ति का एक नौसिखिया से क्या मतलब है?
पलक जैन

@PalakJain का मतलब है कि गतिविधि की स्थिति (नष्ट होने के लिए सक्रिय) एक्स कारणों के आधार पर बदलती रहती है। जब आप इस पर कुछ भी करते हैं तो एक गतिविधि सक्रिय अवस्था में होनी चाहिए। गतिविधि सक्रिय स्थिति में है यदि onResume और onPause के बीच में इसका जीवन है।
जयकृष्णन

खैर, यह समझ में आता है। धन्यवाद!
पलक जैन

3

मैं अपने टुकड़े में इसका इस्तेमाल करता हूं।

Button btn1 = (Button) thisLayout
            .findViewById(R.id.btnDb1);

    btn1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent intent = new Intent(getActivity(), otherActivity.class);
            ((MainActivity) getActivity()).startActivity(intent);

        }
    });

    return thisLayout;
}

0

आपको उन लोगों के लिए getActivity () को MainActivity.this से बदलना पड़ सकता है, जिनके पास इसके साथ समस्याएँ हैं।


0

एक फ्रैगमेंट से नई गतिविधि शुरू करें:

Intent intent = new Intent(getActivity(), TargetActivity.class);
startActivity(intent);

एक गतिविधि से नई गतिविधि शुरू करें:

Intent intent = new Intent(this, TargetActivity.class);
startActivity(intent);

0

कोटलिन के साथ मैं इस कोड को निष्पादित करता हूं:

requireContext().startActivity<YourTargetActivity>()


जब मैं इस कोड None of the following functions can be called with the arguments supplied. startActivity(Intent!) defined in android.content.Context startActivity(Intent!, Bundle?) defined in android.content.Context
टिम

@Tim आपको कोड को काम करने के लिए एंड्रॉइड केटीएक्स की आवश्यकता होगी ।
एडिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.