Bắt đầu một hoạt động từ một phân đoạn


91

Tôi có 2 mảnh vỡ với một nút trên cả hai mảnh. Khi tôi nhấn nút, tôi muốn bắt đầu một Hoạt động mới. Nhưng tôi không thể làm cho nó hoạt động.

Lỗi tôi đang gặp phải: LỖI ở đây: Nhập không khớp: không thể chuyển đổi từ mFragmentFavorite thành Fragment

Tôi đang làm gì sai?

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;
    }
}

Hoạt động yêu thích

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;
    }
}

Nếu FavoriteActivity mở rộng các phân đoạn, lỗi sẽ biến mất nhưng sau đó tôi gặp lỗi tại findViewById(R.id.mainFavorite);và lỗi là

Phương thức findViewById (int) không được xác định cho loại FavoriteActivity

BIÊN TẬP:

Khi tôi nhấn nút trong phân đoạn để bắt đầu hoạt động thì ứng dụng bị treo, đây là logcat của tôi

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
Có lẽ bạn không nên mở rộng FragmentActivity mà thay vào đó là Fragment?
span

1
Chà, đối với một cái mà bạn không sử dụng Fragments. Ít nhất là không có trong mã bạn đã đăng.
adneal

Câu trả lời:


247

mFragmentFavoritetrong mã của bạn là một FragmentActivityđiều không giống với một Fragment. Đó là lý do tại sao bạn nhận được loại không khớp. Ngoài ra, bạn không bao giờ nên gọi newmột Activityvì đó không phải là cách thích hợp để bắt đầu một.

Nếu bạn muốn bắt đầu một phiên bản mới của mFragmentFavorite, bạn có thể làm như vậy thông qua một Intent.

Từ một Fragment:

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

Từ một Activity

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

Nếu bạn muốn bắt đầu aFavoritethay vì mFragmentFavoritethì bạn chỉ cần thay đổi tên của họ trong phần đã tạo Intent.

Ngoài ra, tôi khuyên bạn nên đổi tên lớp để chính xác hơn. Gọi một cái gì đó mFragmentFavoritelà không đúng ở chỗ nó không phải là một Fragment. Ngoài ra, các khai báo lớp trong Java thường bắt đầu bằng một chữ cái viết hoa. Bạn nên đặt tên cho lớp của mình một FavoriteActivitycách chính xác hơn và phù hợp với các quy ước ngôn ngữ. Bạn cũng sẽ cần đổi tên tệp thành FavoriteActivity.java nếu bạn chọn làm điều này vì Java yêu cầu tên lớp phải khớp với tên tệp.

CẬP NHẬT

Ngoài ra, có vẻ như bạn thực sự muốn mFragmentFavoritetrở thành một Fragmentthay vì FragmentActivitydựa trên việc bạn sử dụng onCreateView. Nếu bạn muốn mFragmentFavoritetrở thành một Fragmentthì hãy thay đổi dòng mã sau:

public class mFragmentFavorite extends FragmentActivity{

Thay vào đó, hãy đọc cái này:

public class mFragmentFavorite extends Fragment {

Được rồi, tôi sẽ cập nhật mã trong bài đăng đầu tiên. Nhưng tôi không hiểu lắm về mContextReference. Tôi sẽ cập nhật mã với những gì tôi có và những cái tên hay hơn, hãy cho tôi 5 phút
mXX 18/03

Đó là một ví dụ về tham chiếu đến a Fragmenthoặc an Activity. Nếu bạn đang sử dụng mã bên trong một trong các lớp đó thì bạn chỉ có thể thay thế mContextReferencebằng getActivity()for Fragmenthoặc thisfor Activitytrên dòng đầu tiên và thischo dòng thứ hai. Tôi sẽ cập nhật câu trả lời để rõ ràng hơn.
Michael Celey

Được rồi, tôi đã cập nhật câu hỏi với những cái tên hay hơn và lời khuyên mà bạn đã cho tôi. Bây giờ tôi sẽ cố gắng triển khai đề xuất của bạn để thử và làm cho nó hoạt động. Cảm ơn sự giúp đỡ
mXX

Vâng, tôi đã thay đổi nó trở lại Fragment nhưng tôi gặp lỗi trên btn để tìm ID "Phương thức findViewById (int) không được xác định cho loại FavoriteActivity"
mXX

2
Nếu bạn làm cho nó thành một Fragmentthì hãy thay đổi findViewByIdthành v.findViewById. Không có findViewByIdchức năng nào trong Fragmentđó nên bạn phải gọi getViewtrước sau đó gọi findViewByIdtrên đó. Tuy nhiên, trong trường hợp của bạn, bạn đã có chế độ xem của mình onCreateViewvà đó sẽ là biến số của bạn v.
Michael Celey

21

Bạn nên sử dụng getActivity()để khởi chạy các hoạt động từ các mảnh

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

Ngoài ra, bạn nên đặt tên các lớp bằng chữ viết hoa: MFragmentActivitythay vì mFragmentActivity.


4

Nếu bạn đang sử dụng getActivity () thì bạn phải đảm bảo rằng hoạt động gọi điện đã được thêm vào . Nếu hoạt động chưa được thêm vào trong trường hợp đó, do đó bạn có thể nhận được null khi bạn gọi getActivity ()

trong những trường hợp như vậy getContext () là an toàn

thì mã để bắt đầu hoạt động sẽ được thay đổi một chút như,

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

Activity, Service và Application mở rộng lớp ContextWrapper để bạn có thể sử dụng lớp này hoặc getContext () hoặc getApplicationContext () thay cho đối số đầu tiên.


'Nếu bạn đang sử dụng getActivity () thì bạn phải đảm bảo rằng hoạt động gọi điện đã được thêm vào.' - Dòng này có ý nghĩa gì đối với người mới?
Palak Jain

@PalakJain Điều đó có nghĩa là trạng thái của hoạt động (Hoạt động đến Bị phá hủy) tiếp tục thay đổi tùy thuộc vào x lý do. Một hoạt động phải ở trạng thái hoạt động khi bạn thực hiện bất kỳ điều gì trên đó. Hoạt động ở trạng thái hoạt động nếu thời gian tồn tại của nó ở giữa onResume và onPause.
Jayakrishnan

Chà, điều đó có lý. Cảm ơn!
Palak Jain

3

Tôi sử dụng điều này trong phân đoạn của tôi.

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

Bạn có thể phải thay thế getActivity () bằng MainActivity.this cho những người đang gặp sự cố với điều này.


0

Bắt đầu hoạt động mới từ một mảnh:

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

Bắt đầu hoạt động mới từ một hoạt động:

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

0

với Kotlin, tôi thực thi mã này:

requireContext().startActivity<YourTargetActivity>()


Khi tôi thử mã này, tôi nhận được: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

@Tim Bạn có thể cần KTX Android để mã hoạt động.
Edric
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.