【问题标题】:Going to Main Activity from fragment从片段转到主要活动
【发布时间】:2018-01-17 20:53:22
【问题描述】:

我实现了一个导航抽屉并使用了片段。现在我可以从抽屉菜单切换到片段。但是当我按下返回时,我的应用程序从该片段关闭并且不知道如何返回到主要活动。

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    int id = item.getItemId();
    displaySelectedScreen(id);

    return true;
}

private void displaySelectedScreen(int id) {
    Fragment frag = null;

    switch (id) {
        case R.id.trigger:
            break;
        case R.id.setup:
            if (android.os.Build.VERSION.SDK_INT >= 21) {
                getWindow().setStatusBarColor(Color.parseColor("#7B1FA2"));
            }
            getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#8E24AA")));
            frag = new SettingsF();
            break;
        case R.id.recordings:
            if (android.os.Build.VERSION.SDK_INT >= 21) {
                getWindow().setStatusBarColor(Color.parseColor("#4E342E"));
            }
            getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#8D6E63")));
            break;
        case R.id.howto:
            if (android.os.Build.VERSION.SDK_INT >= 21) {
                getWindow().setStatusBarColor(Color.parseColor("#7B1FA2"));
            }
            getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#8E24AA")));
            break;
        case R.id.about:
            if (android.os.Build.VERSION.SDK_INT >= 21) {
                getWindow().setStatusBarColor(Color.parseColor("#7B1FA2"));
            }
            getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#8E24AA")));
            break;
        case R.id.email_us:
            if (android.os.Build.VERSION.SDK_INT >= 21) {
                getWindow().setStatusBarColor(Color.parseColor("#7B1FA2"));
            }
            getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#8E24AA")));
            break;
    }
    if (frag != null) {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.content_main, frag);
        ft.addToBackStack(ft.getClass().getSimpleName()).commit();
    }
    DrawerLayout drawer = findViewById(R.id.drawer);
    drawer.closeDrawer(GravityCompat.START);
}

这里只是设置片段:

public class SettingsF extends ListFragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_settings, container, false);
    String[] datasource = {"Trusted Contacts", "Custom Text Set-Up"};
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), R.layout.rowlayout, R.id.txtitems, datasource);
    setListAdapter(adapter);
    setRetainInstance(true);

    return rootView;
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    getActivity().setTitle("Context Set-Up");
}

public void onListItemClick(ListView l, View view, int position, long id) {
    ViewGroup viewGroup = (ViewGroup) view;
    TextView tv = (TextView) viewGroup.findViewById(R.id.txtitems);
    Toast.makeText(getActivity(), tv.getText().toString(), Toast.LENGTH_LONG).show();
}

@Override
public void onResume() {
    getView().setFocusableInTouchMode(true);
    getView().requestFocus();
    getView().setOnKeyListener( new View.OnKeyListener()
    {
        @Override
        public boolean onKey( View v, int keyCode, KeyEvent event )
        {
            if( keyCode == KeyEvent.KEYCODE_BACK )
            {
                //Already Used Intent, doesn't work
                return true;
            }
            return false;
        }
    } );
    super.onResume();
}

}

我更新了问题。我已经使用了 addToBackStack(),然后覆盖了 onResume() 方法,但是当按下后退按钮时应用程序仍然终止。 我对此真的很陌生,所以不要误解我在整个代码中实现了什么。 提前致谢

【问题讨论】:

    标签: android-studio android-fragments android-activity


    【解决方案1】:

    用于硬件后退按钮 在片段的 onResume 方法中添加此代码

    //You need to add the following line
    fragment.getView().setFocusableInTouchMode(true);
    fragment.getView().requestFocus();
    fragment.getView().setOnKeyListener( new OnKeyListener()
    {
        @Override
        public boolean onKey( View v, int keyCode, KeyEvent event )
        {
            if( keyCode == KeyEvent.KEYCODE_BACK )
            {
              //here use intent to call mainActivity 
                return true;
            }
            return false;
    }
    } );
    

    希望对你有帮助

    【讨论】:

    • 谢谢你的朋友:)
    【解决方案2】:

    ft.replace()之后添加这一行:

    ft.addToBackStack(null);
    

    这一行将使每次您从导航抽屉中选择一个项目时,都会建立片段历史记录。然后,当您按下返回按钮时,您将返回历史记录。如果您没有历史记录项,应用程序将关闭。

    更复杂的实现可能使用名称参数(如“FragA”或“FragB”)而不是null 作为addToBackStack() 的参数,然后检查您的片段是否已经存在于返回堆栈中总是打开一个新的。那样的话,如果你去 A->B->A->B->A->B 你就不会在历史上拥有三个 A 副本和两个 B 副本。

    【讨论】:

    • 谢谢,但我想回到主要活动,所以不起作用!
    • @Asif-UlIslamAkash 对不起,我想我误解了这个问题。你说的“主要活动”是什么?您的问题仅显示片段逻辑。
    • @Asif-UlIslamAkash 我无法解释我为什么感到困惑。当你的应用启动时,你会看到一些默认的 UI。当您在导航抽屉中单击以显示新的片段内容时,将其添加到后堆栈应该可以使单击后返回您的默认(启动)内容。
    • 它应该在创造历史之后。但回不去了。应用关闭。
    • 我更具体地编辑了这个问题,看看。
    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2016-08-17
    • 2016-07-28
    相关资源
    最近更新 更多