Android:导航到另一个片段

时间:2018-02-05 22:04:26

标签: java android android-fragments kotlin

我有ViewPagerTabLayout设置,包含4个片段,就像任何现代社交应用一样。我试过,试过,试过,但我找不到问题的答案。在其中一个选项卡中,我想从片段导航到另一个片段,但不是导航,而是将其置于顶部,我仍然可以与之前的片段进行交互。它并没有取代,只是将它层叠在一起。

代码:

// Chat fragment : Inside the onCreateView fun
this.loadConvos({
            chats ->
            this.chatsArray = chats
            this.chatsArray.sortBy { it.timestamp}
            this.chatsArray.reverse()

            listView.adapter = ChatBaseAdapter(this.chatsArray, context)
            listView.setOnItemClickListener {
                parent, view, position, id ->
                this.chatID = this.chatsArray[position].chatID!!
                Toast.makeText(context, "Position Clicked: " + position, Toast.LENGTH_SHORT).show()

                childFragmentManager
                        .beginTransaction()
                        .replace(R.id.chatFragmentLayout, MessagesFragment())
                        .addToBackStack(null)
                        .commit()
            }
        }, {
            error ->
            print(error)
        })

该功能只是加载listView,其中包含用户具有的聊天详细信息,我可以点按,Toast将为我提供单元格位置,但是当它commit()时,它只是对MessagesFragment()进行分层1}}位于ChatsFragment()之上。我也想知道如何将信息传递给下一个片段。这种方法我没有看到传递数据的方法,这与我所知道的常规Bundle/Intent方式不同。

viewpager上的XML Chat:

<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/chatFragmentLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"

tools:context="io.jedi.jedi.fragments.ChatFragment">

<ListView
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

</FrameLayout>

XML消息

<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/messagesFragmentLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"

tools:context="io.jedi.jedi.fragments.MessagesFragment">

<TextView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="Messages" />

</FrameLayout>

2 个答案:

答案 0 :(得分:0)

如果您尝试切换到的Fragment是ViewPager中的FragmentTransaction,则不应通过setCurrentItem()手动更改它。您应该在ViewPager上致电Activity(请参阅在线文档中的link)。如果通过其中一个片段进行此调用,您还需要使用某种形式的界面在父FragmentFragment之间进行通信(请参阅here)。

至于你的第二个问题,如果你打算在你的ViewPagernode_modules不断变化,你将不得不考虑更多。否则,您应该查看新实例类型模式,如此post中所述。

答案 1 :(得分:0)

片段具有void setArguments(Bundle)Bundle getArguments()方法,您可以使用与使用活动意图相同的方式。

例如,来自official documentation

public class CountingFragment extends Fragment {

    private int mNum;

    public static CountingFragment newInstance(int num) {
        CountingFragment f = new CountingFragment();

        Bundle args = new Bundle();
        args.putInt("num", num);
        f.setArguments(args);

        return f;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mNum = getArguments() != null ? getArguments().getInt("num") : 1;
    }
}

或者在Kotlin:

class CountingFragment : Fragment() {

    companion object {
        fun newInstance(number: Int): CountingFragment {
            return CountingFragment().apply {
                arguments = Bundle().apply {
                    putInt("number", number)
                }
            }
        }
    }

    private var number: Int = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        number = arguments?.getInt("number") ?: 0
    }

}