使用按钮在片段之间切换

卡帕里诺

在我的应用程序中,我有一个活动和两个片段。我想做的是用按钮在这两个片段之间导航。每个导航按钮都在片段中定义。

第一个问题是,使用下面的代码,我在应用程序运行时遇到异常

E/AndroidRuntime: FATAL EXCEPTION: main
        java.lang.RuntimeException: Unable to start activity ComponentInfo{...MainActivity}: 
            java.lang.IllegalArgumentException: No view found for id 0x7f0c0050 for fragment Fragment1{b41da690 #0 id=0x7f0c0050}
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
        at android.app.ActivityThread.access$600(ActivityThread.java:130)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4745)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)
        Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f0c0050 for fragment Fragment1{b41da690 #0 id=0x7f0c0050}
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:823)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035)
        at android.app.BackStackRecord.run(BackStackRecord.java:635)
        at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1397)
        at android.app.Activity.performStart(Activity.java:5017)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2032)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
        at android.app.ActivityThread.access$600(ActivityThread.java:130) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:137) 
        at android.app.ActivityThread.main(ActivityThread.java:4745) 
        at java.lang.reflect.Method.invokeNative(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:511) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
        at dalvik.system.NativeStart.main(Native Method) 

代码:

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // set desired fragment for the first time
        setFragment(this, new Fragment1());
    }

    public void switch_fragment(View view, String fragmentID) {
        Fragment newFragment = null;
        switch (fragmentID) {
            case Fragment1.ID:
                newFragment = new Fragment1();
                break;
            case Fragment2.ID:
                newFragment = new Fragment2();
                break;
        }
        setFragment(this, newFragment);
    }

    public static void setFragment(Activity activity, Fragment fragment) {
        FragmentTransaction fragmentTransaction = activity.getFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.fragment_placeHolder, fragment);
        fragmentTransaction.commit();
    }
}

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <FrameLayout
        android:id="@+id/fragment_placeHolder"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </FrameLayout>

    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/fragment1"
        />
    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/fragment2"
        />
</RelativeLayout>

Fragment1.java

public class Fragment1 extends Fragment {

    public static final String ID = "1";

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment1, container, false);
    }

}

fragment1.xml

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="GO TO FRAGMENT 1"
        android:id="@+id/btn_1"
        android:onClick="switch_fragment"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        />
</RelativeLayout>

Fragment2.java

public class Fragment2 extends Fragment {

    public static final String ID = "2";

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment2, container, false);
    }

}

fragment2.xml

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="GO TO FRAGMENT 2"
        android:id="@+id/btn_2"
        android:onClick="switch_fragment"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        />
</RelativeLayout>

如果此示例是错误的实现方式,请为新手链接一些类似的示例。

TD阮

您错过了一个非常重要的部分,setContentView并且在使用replace之前,您应该有一个现有的片段。所以在onCreate变化中:

// set desired fragment for the first time
        setFragment(this, new Fragment1());

应更改为:

   setContentView(R.layout.main_activity);//then
   // set desired fragment for the first time
   FragmentManager fm = getSupportFragmentManager();
   FragmentTransaction ft = fm.beginTransaction();

    // The id specified here identifies which ViewGroup to
    // append the Fragment to.
    ft.add(R.id.fragment_placeHolder, new Fragment1());
    ft.commit();

尝试更换:

... activity.getFragmentManager()

和:

... getSupportFragmentManager()

并删除:

<fragment
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/fragment1"
    />
<fragment
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/fragment2"
    />

最后,将更switch_fragment改为:

public void switch_fragment(View view) {
        Fragment newFragment = null;
        switch (view.getID()) {
            case R.id.btn_2:
                newFragment = new Fragment1();
                break;
            case R.id.btn_1:
                newFragment = new Fragment2();
                break;
        }
        setFragment(this, newFragment);
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在两个片段之间切换的最佳方法

来自分类Dev

使用jQuery切换单选按钮

来自分类Dev

使用返回按钮在片段之间切换

来自分类Dev

如何在片段中使用切换按钮

来自分类Dev

在单选按钮组之间切换

来自分类Dev

在包含RecyclerView的片段之间切换时发生NullPointerException

来自分类Dev

Android:使用标签在不同片段之间切换

来自分类Dev

使用切换按钮控制声音

来自分类Dev

在片段之间切换并显示隐藏AlertDialog并保持状态

来自分类Dev

使用viewpager和radiogroup在片段之间切换

来自分类Dev

如何在Android中使用单选按钮组ID在不同片段之间进行切换

来自分类Dev

在片段之间切换后,RecyclerView项目消失了

来自分类Dev

重新加载活动以在片段之间重新切换

来自分类Dev

使用切换按钮移除容器

来自分类Dev

在片段之间切换时如何保存地图状态?

来自分类Dev

如何使用JS切换按钮

来自分类Dev

在片段TabHost中的选项卡之间切换

来自分类Dev

如何在片段容器之间轻松切换?

来自分类Dev

使用CSS在combox和单选按钮之间切换

来自分类Dev

在没有“ FragmentPagerAdapter”的片段之间切换

来自分类Dev

使用按钮在可见和隐藏之间切换

来自分类Dev

Android开发,使用切换按钮关闭片段

来自分类Dev

在布局之间切换单选按钮

来自分类Dev

重新加载活动以在片段之间重新切换

来自分类Dev

使用按钮或链接文本在许多Highcharts之间切换

来自分类Dev

在片段之间切换不会调用onStop方法

来自分类Dev

在片段之间切换时如何处理相机?

来自分类Dev

如何使用 Matplotlib 中的按钮在图表之间切换

来自分类Dev

使用 onClickListener 切换片段

Related 相关文章

热门标签

归档