这是使用兼容包的小型Android 2.2测试应用程序.这是(当然错误的)我在接收点击时尝试替换片段的方式.我正在尝试用相同Fragment类的新(不同)实例替换它.正如我将解释它不能按预期工作,我需要帮助:
public class MainFragmentActivity extends FragmentActivity {
...
public void myAction(View view) {
...
RightFragment newRightFrag = RightFragment.newInstance(myNewOption);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
ft.replace(R.id.landscape_right_fragment, newRightFrag);
ft.commit();
}
}
Run Code Online (Sandbox Code Playgroud)
你一定会看到我的错误.无论如何,让我们更多地解释应用程序应该做什么:
景观取向:
--------- ----------
| L | R | -> click -> | L | R2 |
--------- ----------
Run Code Online (Sandbox Code Playgroud)
在横向方向上,活动有一个包含2个片段的视图:" leftLand "和" rightLand ",如果单击片段" leftLand " 的按钮,则它会更改创建一个新片段并将" rightLand "片段实例替换为另一个片段FragamentActivity类的实例.使这两个实例不同的是传递给"newInstance(int)"的参数,它基于单击的按钮.
纵向 :
----- -----
| | | |
| L | -> click -> | R |
| | | | …Run Code Online (Sandbox Code Playgroud) 我有一个UI,我需要Fragment在横向模式下显示(带有视图),但不能在纵向模式下显示.在纵向模式下,它应该仍然可用,但会使用ListPopupWindow相反的方式显示其结果.
我想我可以通过使用<fragment />横向布局的标签来处理这个问题,同时如果它没有启动(在我们是肖像的情况下)以编程方式创建片段.
只要从横向开始,这种方法就可以正常工作,如果以纵向方式开始,以编程方式创建片段,当您尝试将片段附加到布局时旋转模拟器时,应用程序将崩溃:
java.lang.IllegalStateException:Fragment没有创建视图.在android.app.Activity.onCreateView(Activity.java:4095)
这些文档Fragment.isInLayout()似乎暗示它应该能够以这种方式处理它:
如果布局通过标记包含在活动视图层次结构中,则返回true.当通过标记创建片段时,这将始终为真,除非旧片段从先前状态恢复且未出现在当前状态的布局中.
所以问题是如何正确地做到这一点,或者是否有我遗漏的东西?
更新:
似乎不像isInLayout()现在这样表现.如果已Fragment手动将a 添加到容器,则返回false .
此外,如果您Fragment手动添加到容器,然后将(设备)旋转到不包含该布局的布局,它将崩溃:
引起:java.lang.IllegalArgumentException:在android.app.FragmentManagerImpl.moveToState(FragmentManager.java:722)中找不到片段SearchFragment {4042f868#2 id = 0x7f060011 SearchFragment}的id 0x7f060011的视图
我正在使用Android导航组件进行导航.我有一个LoginFragment,它有一个按钮可以转换到SignUpFragment.单击按钮我收到此错误.
java.lang.IllegalStateException: View android.support.v7.widget.AppCompatButton{49d9bd1 VFED..C.. ...P.... 201,917-782,1061 #7f090172 app:id/signUpLink} does not have a NavController set
Run Code Online (Sandbox Code Playgroud)
这是我的nav_graph.xml
<navigation xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
app:startDestination="@id/loginFragment">
<fragment
android:id="@+id/loginFragment"
android:name="org.fossasia.openevent.app.core.auth.login.LoginFragment"
android:label="login_fragment"
tools:layout="@layout/login_fragment">
<action
android:id="@+id/action_loginFragment_to_signUpFragment"
app:destination="@id/signUpFragment" />
</fragment>
</navigation>
Run Code Online (Sandbox Code Playgroud)
以下是LoginFragment for Navigation中的代码 -
binding.signUpLink.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_loginFragment_to_signUpFragment, null));
Run Code Online (Sandbox Code Playgroud)
以下是NavHostFragment的活动布局文件的摘录 -
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:name="android.navigation.fragment.NavHostFragment"
app:navGraph="@navigation/main_navigation"
app:defaultNavHost="true"/>
Run Code Online (Sandbox Code Playgroud) android android-architecture-components android-architecture-navigation
我最近开始考虑为我的Android设备开发应用程序.让我感兴趣的是我正在玩一些arduinos有一个好主意,让他们与我的手机通信,就像我在arduino本身测量的任何值的接口.现在我可以采取简单的方法,并使用公共资源来实现这一目标,但没有那么多的学习方式,我希望它以我想要的方式.
现在我想我需要问的第一个问题是,多个片段/单个活动是否是我完成此任务的最佳方式?基本上,我希望1连接到arduino,拉出所有值,但根据我选择的"标签",我希望某些值显示某些方式.我决定让每个标签成为不同的片段,只是以不同的方式显示值.就像我说的,我刚刚开始Android开发经验,所以没有多少基础上的这个选择.
因此,我要注意这个多片段的想法:
所以基本上我的onMenuItemSelect看起来像这样.
FragmentTransaction FT = getFragmentManager.beginTransaction();
switch(position){
case 1:
FT.replace(R.id.fragment_container, new MyFragment()).commit();
break;
case 2:
FT.replace(R.id.fragment_container, new MySecondFragment()).commit();
break;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码工作,它做了我想要的没有任何问题.我不是很喜欢这个,因为对于我想要添加的每个片段,我需要为交换机添加一个新的案例.此外,每次都会实例化一个新片段,即使已经创建了一个片段.那是问题吗?
我遇到的最大问题是它不是最容易扩展的.对于2-3个碎片,这不是处理它的最糟糕方式(在我看来).我希望能够拥有我想要的尽可能多的片段而没有针对交换机中每个人的个别情况.所以我所做的是创建了一个fragmentList来保存每个片段的单个实例.
List<Fragment> fragmentList;
private void populateFragmentList();{
fragmentList = new ArrayList<Fragment>();
fragmentList.add(new HomeFrag());
fragmentList.add(new BluetoothFragment());
fragmentList.add(new USBFragment());
fragmentList.add(new RCInfoFragment());
fragmentList.add(new ControllerFragment());
fragmentList.add(new FingerCordsFrag());
}
public void onMenuItemSelect(int position, int curPosition){
if(fragmentList.get(position).isAdded()){
getFragmentManager().beginTransaction().show(fragmentList.get(postition))
.hide(fragmentList.get(curPosition)).commit();
}
else
getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentList.get(position)).show(fragmentList.get(position)).hide(fragmentList.get(curPosition)).commit();
}
Run Code Online (Sandbox Code Playgroud)
这种方法也奏效了.我可以让它显示我的所有片段,而不必每次都重新实例化每个片段.我相信这可以做我想做的事情,它可以很好地扩展(比交换机/情况IMO更好).我现在遇到的问题是,当我改变方向时,一切都变得疯狂.到目前为止,我只是测试肖像模式,当我在其他方向选择它时,我无法查看任何片段.我可以在任何一个方向启动它,它可以工作,但是当我在运行期间更改它时,我只能看到我改变方向时打开的一个片段.
现在,正在调用每个片段"onCreateView",只是显示没有显示.我相信我已经缩小到它不会附加到从方向改变创建的新活动.无论如何,我可以重新附加已经创建的片段到新活动.
总之,我的问题是:
感谢您的时间.
*必须动态输入所有这些代码,因为我出于某种原因无法正确地格式化我的C/P代码.