如何在 Android 中由 WearableActivity 启动的片段中使用 getActivity?

How to use getActivity in a fragment started by a WearableActivity in Android?

我有一个 WearableActivity 作为我的主要 activity,我想为不同的布局使用片段。问题是当我尝试在片段中使用 getActivity() 获取对主要 activity 的引用时,Android Studio 说我无法从 FragmentActivity 转换到我的 MainWearActivity(它扩展了 WearableActivity)。

我的 MainWearActivity class:

public class MainWearActivity extends WearableActivity implements
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener{

    private WatchViewStub mContainerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_wear);
        mContainerView = (WatchViewStub) findViewById(R.id.mainContainer);
        mContainerView.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
            @Override
            public void onLayoutInflated(WatchViewStub watchViewStub) {

            }
        });
    }

    @Override
    public void onConnected(Bundle bundle) {

    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {

    }

    @Override
    public void onEnterAmbient(Bundle ambientDetails) {
        super.onEnterAmbient(ambientDetails);
    }

    @Override
    public void onUpdateAmbient() {
        super.onUpdateAmbient();
    }

    @Override
    public void onExitAmbient() {
        super.onExitAmbient();
    }
}

我的片段class:

public class NavigationFragment extends Fragment {
    View view;
    MainWearActivity mMainWearActivity;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.navigation_fragment, container, false);

        mMainWearActivity = (MainWearActivity) getActivity(); // ERROR HERE

        return view;
    }
}

当我尝试将 getActivity() 的结果转换为我的主 activity 时,它不允许我这样做。谁能帮我解决这个问题?我需要对我的主要 activity 的引用,以便我可以将它用作上下文。谢谢

编辑

下面字符串的回答解决了这个问题。但是,我想补充一点,如果您使用的是片段寻呼机适配器,则必须将 "compile 'com.android.support:support-v13:23.1.1'" 添加到您的 build.gradle,并使用允许您的支持 v13 寻呼机适配器从 GetItem() 到 return 一个 android.app.Fragment。

你的 NavigationFragmentandroid.support.v4.app.Fragment 的实例吗?我猜是这样,因为那是 Fragment class 期望 getActivity() 到 return 一个 FragmentActivity.

如果我的猜测是正确的,您需要做的是在您的 NavigationFragment.java 文件中找到如下行:

import android.support.v4.app.Fragment;

并将其更改为

import android.app.Fragment;

您可能需要类似地更改一些其他导入和调用,以删除对支持库及其 classes 的引用。但是没有必要在 Wear 上使用支持片段 - 所有设备都足够新,可以原生支持片段。

您应该实施 AmbientMode.AmbientCallbackProvider 而不是使用 WearableActivity

这是新的首选方法,它仍然为您提供 onEnterAmbient()onAmbientUpdate()onExitAmbient(),但也允许您使用 Activity(或任何子 类... FragementActivity 等)。它还允许您支持架构组件。

Official docs call out the details.