点击OptionsMenu Item

时间:2017-02-27 12:40:10

标签: android android-layout android-fragments

我尝试使用片段更改我的应用程序的视图。 我试了几天,所以我做了一个干净的代码来表达我的问题。 我有一个带有OptionsMenu的MainActivity,在这个OptionsMenu中我有一个名为“action_connect”的项目。 我的应用程序的第一个视图应该是一个干净的页面(没有任何内容)。 当有人点击“action_connect”项时,我希望View更改为我的Fragment,其中我有一个TextView。 当前代码出现问题:点击该项目时应用程序将崩溃。

我希望你能帮助我解决这个问题。提前谢谢。

继承我的代码:

MainActivity:

public class MainActivity extends AppCompatActivity {

@Override
public void onCreate(Bundle savedInstance){
    super.onCreate(savedInstance);



}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.

    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();

    MainActivityFragment mMainActivityFragment = new MainActivityFragment();

    int id = item.getItemId();

    if (id == R.id.action_connect) {

        ft.replace(R.id.default_container, mMainActivityFragment);
    }


    ft.commit();
    return super.onOptionsItemSelected(item);

}

片段:

public class MainActivityFragment extends Fragment{

@Override
public void onCreate(Bundle savedInstance){
    super.onCreate(savedInstance);



}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState){

    //get command buttons
    View rootView = inflater.inflate(R.layout.fragment_connect, parent, false);

    return rootView;
}

}

片段-XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:text="Welcome!"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/textView"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="36dp" />

活动-XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">

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

以下是日志,希望它是正确的:

02-27 12:44:44.473 5513-5513/? I/art: Not late-enabling -Xcheck:jni (already on)
02-27 12:44:44.475 5513-5513/? W/art: Unexpected CPU variant for X86 using defaults: x86
02-27 12:44:44.530 5513-5513/hsulm.cermitbasmati_2.app W/System: ClassLoader referenced unknown path: /data/app/hsulm.cermitbasmati_2.app-1/lib/x86
02-27 12:44:44.544 5513-5513/hsulm.cermitbasmati_2.app I/InstantRun: Instant Run Runtime started. Android package is hsulm.cermitbasmati_2.app, real application class is null. [ 02-27 12:44:44.544  1560: 1587 D/         ]HostConnection::get() New Host Connection established 0x98e23700, tid 1587
02-27 12:44:45.850 5513-5513/hsulm.cermitbasmati_2.app W/System: ClassLoader referenced unknown path: /data/app/hsulm.cermitbasmati_2.app-1/lib/x86
02-27 12:44:45.938 5513-5513/hsulm.cermitbasmati_2.app W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
02-27 12:44:46.028 5513-5557/hsulm.cermitbasmati_2.app I/OpenGLRenderer: Initialized EGL, version 1.4
02-27 12:44:46.028 5513-5557/hsulm.cermitbasmati_2.app D/OpenGLRenderer: Swap behavior 1
02-27 12:44:46.159 5513-5557/hsulm.cermitbasmati_2.app E/EGL_emulation: tid 5557: eglSurfaceAttrib(1174): error 0x3009 (EGL_BAD_MATCH)
02-27 12:44:46.159 5513-5557/hsulm.cermitbasmati_2.app W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x99e9ce20, error=EGL_BAD_MATCH
02-27 12:44:48.028 5513-5513/hsulm.cermitbasmati_2.app W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
02-27 12:44:48.105 5513-5557/hsulm.cermitbasmati_2.app E/EGL_emulation: tid 5557: eglSurfaceAttrib(1174): error 0x3009 (EGL_BAD_MATCH)
02-27 12:44:48.105 5513-5557/hsulm.cermitbasmati_2.app W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x99287620, error=EGL_BAD_MATCH
02-27 12:44:49.497 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager: No view found for id 0x7f0b0057 (hsulm.cermitbasmati_2.app:id/default_container) for fragment MainActivityFragment{1d6183d #0 id=0x7f0b0057}
02-27 12:44:49.498 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager: Activity state:
02-27 12:44:49.498 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager:   Local FragmentActivity 5db9396 State:
02-27 12:44:49.498 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager:     mCreated=truemResumed=true mStopped=false mReallyStopped=false
02-27 12:44:49.498 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager:     mLoadersStarted=true
02-27 12:44:49.498 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager:   FragmentManager misc state:
02-27 12:44:49.498 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager:     mHost=android.support.v4.app.FragmentActivity$HostCallbacks@fb91832
02-27 12:44:49.498 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager:     mContainer=android.support.v4.app.FragmentActivity$HostCallbacks@fb91832
02-27 12:44:49.499 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager:     mCurState=5 mStateSaved=false mDestroyed=false
02-27 12:44:49.499 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager:   View Hierarchy:
02-27 12:44:49.499 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager:     com.android.internal.policy.DecorView{fdab983 V.E..... ... 0,0-1080,1920}
02-27 12:44:49.499 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager:       android.widget.LinearLayout{2f91700 V.E..... ... 0,0-1080,1776}
02-27 12:44:49.499 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager:         android.view.ViewStub{310fb39 G.E..... ... 0,0-0,0 #10203ef android:id/action_mode_bar_stub}
02-27 12:44:49.499 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager:         android.widget.FrameLayout{1dc857e V.E..... ... 0,72-1080,1776}
02-27 12:44:49.499 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager:           android.support.v7.widget.ActionBarOverlayLayout{9056adf V.E..... ... 0,0-1080,1704 #7f0b0045 app:id/decor_content_parent}
02-27 12:44:49.499 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager:             android.support.v7.widget.ContentFrameLayout{558a32c V.E..... ... 0,168-1080,1704 #1020002 android:id/content}
02-27 12:44:49.499 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager:             
02-27 12:44:49.499 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager: android.support.v7.widget.ActionBarContainer{87d11f5 V.ED.... ... 0,0-1080,168 #7f0b0046 app:id/action_bar_container}
02-27 12:44:49.500 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager:               android.support.v7.widget.Toolbar{1377b8a V.E..... ... 0,0-1080,168 #7f0b0047 app:id/action_bar}
02-27 12:44:49.500 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager:                 android.support.v7.widget.AppCompatTextView{2ffd5fb V.ED.... ... 48,43-544,124}
02-27 12:44:49.500 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager:                 android.support.v7.widget.ActionMenuView{542c618 V.E..... ... 960,0-1080,168}
02-27 12:44:49.500 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager:                   android.support.v7.widget.ActionMenuPresenter$OverflowMenuButton{459d871 VFED..CL ... 0,12-120,156}
02-27 12:44:49.500 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager:               android.support.v7.widget.ActionBarContextView{299c656 G.E..... ... 0,0-0,0 #7f0b0048 app:id/action_context_bar}
02-27 12:44:49.500 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager:       android.view.View{26bd6d7 V.ED.... ... 0,1776-1080,1920 #1020030 android:id/navigationBarBackground}
02-27 12:44:49.500 5513-5513/hsulm.cermitbasmati_2.app E/FragmentManager:       android.view.View{4aa2bc4 V.ED.... ... 0,0-1080,72 #102002f android:id/statusBarBackground}
02-27 12:44:49.501 5513-5513/hsulm.cermitbasmati_2.app D/AndroidRuntime: Shutting down VM
02-27 12:44:49.501 5513-5513/hsulm.cermitbasmati_2.app E/AndroidRuntime: FATAL EXCEPTION: main
                                                                         Process: hsulm.cermitbasmati_2.app, PID: 5513
                                                                         java.lang.IllegalArgumentException: No view found for id 0x7f0b0057 (hsulm.cermitbasmati_2.app:id/default_container) for fragment MainActivityFragment{1d6183d #0 id=0x7f0b0057}
                                                                             at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:987)
                                                                             at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1171)
                                                                             at android.app.BackStackRecord.run(BackStackRecord.java:816)
                                                                             at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1578)
                                                                             at android.app.FragmentManagerImpl$1.run(FragmentManager.java:483)
                                                                             at android.os.Handler.handleCallback(Handler.java:751)
                                                                             at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                             at android.os.Looper.loop(Looper.java:154)
                                                                             at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                             at java.lang.reflect.Method.invoke(Native Method)
                                                                             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

6 个答案:

答案 0 :(得分:1)

我现在可以看到你的问题了,我想你错过了把这一行放在你的MainActivity课程中:

@Override
public void onCreate(Bundle savedInstance){
    super.onCreate(savedInstance);
    setContentView(R.layout.your_activity_layout);
}

使用Fragment方法替换带有ID的replace时,您应该使用setContentView()方法,以便您可以访问要替换的FrameLayout的ID在你的情况下:default_container

答案 1 :(得分:0)

更改此

ft.replace(R.id.default_container, mMainActivityFragment);

ft.replace(R.id.default_container, mMainActivityFragment).commit();

答案 2 :(得分:0)

在onOptionsItemSelected中调用MainActivityFragment,如下所示:

 if (id == R.id.action_connect) {
     FragmentManager fm = getFragmentManager();
     fm.beginTransaction().replace(R.id.default_container, new MainActivityFragment(), "Tag").commit();
 }

希望这有帮助。

答案 3 :(得分:0)

我认为这会解决,我希望我已经帮助了

            Fragment mMainActivityFragment = null;

            mMainActivityFragment = new MainActivityFragment();
            FragmentManager fm = getSupportFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            ft.replace(R.id.default_container, mMainActivityFragment);
            ft.commit();

答案 4 :(得分:0)

使用此功能可以帮助您 删除ft.replace(R.id.default_container, mMainActivityFragment); 添加if (id == R.id.action_connect) { }

  Fragment fragment = new MainActivityFragment;
                FragmentManager fragmentManager = getSupportFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.default_container, fragment);
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.commit();

答案 5 :(得分:0)

首先,请确保您使用的是support.v4片段,然后尝试此操作。

private void setUpFragment(SomeFragment fragment){
FragmentManger mFragmentManager = getSupportFragmentManager();

mFragmentManager.beginTransaction()
    .replace(R.id.default_container, fragment, "FrgamentTAG")
    .addToBackStack(null)
    .commitAllowingStateLoss();

mFragmentManager.executePendingTransactions();
}
相关问题