【问题标题】:What to use instead of startActivity(intent) in FragmentActivity?在 FragmentActivity 中使用什么代替 startActivity(intent)?
【发布时间】:2017-11-10 17:23:37
【问题描述】:

由于 FragmentActivity 中的某种原因,startActivity() 不起作用,当我单击我的按钮时,它会导致应用程序崩溃并出现以下错误:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.name.app/com.example.name.app.WorldTabBar}: java.lang.ClassCastException: com.example.name.app.WorldTabBar cannot be cast to android.app.Activity

这是我的代码:

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback{

Button live;

private GoogleMap mMap;

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);

final SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);


live=findViewById((R.id.GoToLive));

live.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View view) {

             Intent startIntent = new Intent(MapsActivity.this, WorldTabBar.class);
              startActivity(startIntent);                  
        }
    });

startActivity() 在 FragmentActivity 中使应用程序崩溃。 FragmentActivity 不允许我使用 getActivity(),因为我应该使用“.this”,但这不适用于 startActivity()。

我尝试代替 FragmentActivity,只使用扩展 Fragment 并使用 rootView 将 onCreate 更改为 onCreateView 方法,然后在任何地方添加 getActivity() 和

getActivity().startActivity(startIntent);  //<-didn't work, crashes again

这是我的 manifest.xml:

    </activity>
    <activity
        android:name=".MainActivity"
        android:exported="true"
        android:label="@string/title_activity_main" />
   <activity android:name=".WorldTabBar" />

    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="@string/myKey" />

    <activity
        android:name=".MapsActivity"
        android:label="@string/title_activity_maps"></activity>
</application>

也许我可以使用一些东西来代替 startActivity() 但它执行相同的操作?其实……

   Intent startIntent = new Intent(MapsActivity.this, WorldTabBar.class);

...^ 上面的代码即使在没有 startActivity() 的情况下也可以自行工作,但是我认为没有开始代码,现在我的 overridePendingTransition 代码无法被识别。那么是否有一些我可以在 FragmentActivity 中使用的代码类似于 startActivity() 但不是 startActivity()?

编辑:

WorldTabBar 类:

   public class WorldTabBar extends Fragment {


    Button world;

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




    world=rootView.findViewById(R.id.GoToWorld);
            world.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                     Intent startIntent = new Intent(getContext(), MapsActivity.class);
                     startActivity(startIntent);

     getActivity().overridePendingTransition(R.anim.slide_in_right, R.anim.no_anim);

                     }
            });

    return rootView;
    }


    }

【问题讨论】:

  • 能否请您添加WorldTabBar 的代码 - 它扩展了哪个类?
  • 我在代码中添加了 WorldTabBar 类。
  • 如果您想从活动类开始片段,请查看此链接:teamtreehouse.com/community/…。它可能会帮助你。

标签: android android-fragments android-intent onclicklistener android-fragmentactivity


【解决方案1】:

java.lang.ClassCastException: com.example.name.app.WorldTabBar 无法转换为 android.app.Activity

您的 WorldTabBar 扩展 Fragment,而不是 Activity 类。

1) 你需要添加activity,然后添加WorldTabBar片段。

例如,创建WorldTabBarActivity 扩展Activity,在清单上注册它以使用此活动:

Intent startIntent = new Intent(MapsActivity.this, WorldTabBarActivity.class);

将片段添加到活动中的选项之一(使用 XML)在此处描述:https://developer.android.com/training/basics/fragments/creating.html。另一种选择 - 在运行时添加片段 - https://developer.android.com/training/basics/fragments/fragment-ui.html#AddAtRuntime

2) 更改代码使其活动:

public class WorldTabBar extends AppCompatActivity {

【讨论】:

  • 那我应该改变什么?
猜你喜欢
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多