如何在 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。
你的 NavigationFragment
是 android.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 等)。它还允许您支持架构组件。
我有一个 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。
你的 NavigationFragment
是 android.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 等)。它还允许您支持架构组件。