请提出解决方案。
当我旋转片段时,它应该切换到横向模式并显示另一个布局。但是屏幕不会旋转到横向。
我的代码打击:
<activity
android:name=".activites.MainActivity"
android:launchMode="singleInstance"
android:configChanges="keyboardHidden|screenLayout|screenSize|orientation"
/>
这是名为仪表板的主要布局,现在它处于纵向模式:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view=View.inflate(getContext(), R.frag_dashboard,null);
changeview= (ShimmerTextView)view.findViewById(R.id.changeview);
return view;
}
当我旋转屏幕时,此片段更改为横向模式并设置另一个布局,pray_times是新布局。
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(getContext(), "landscape", Toast.LENGTH_SHORT).show();
view=View.inflate(getContext(), R.layout.prayer_times,null);
}
}
我为pray_times创建layout_land
答案 0 :(得分:7)
这是旧问题 但 我想分享我的解决方案。
如果片段在方向改变时没有重新加载的问题,则只需重新加载即可。
在layout
和layout-land
文件夹中添加两个具有相同名称的布局。
这将在加载时显示正确的布局,以便在设备旋转时更改布局
在onConfigarationChanged方法中添加以下内容。
@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE || newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
try {
FragmentTransaction ft = getFragmentManager().beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
ft.setReorderingAllowed(false);
}
ft.detach(this).attach(this).commit();
} catch (Exception e) {
e.printStackTrace();
}
}
}
答案 1 :(得分:2)
如果在旋转屏幕时调用onCreateView
功能,可以在其中执行此操作:
if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE) {
......
} else if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_PORTRAIT) {
.........
}
答案 2 :(得分:1)
你要做的事情相当复杂。 Android碎片不是要旋转的。 我遇到了同样的问题并找到了解决方案。就我而言,我想呈现一个片段,其中包含可根据方向旋转的不同菜单页面。
只需创建一个作为基础的片段,并包含一个简单的LinearLayout(或您想要的任何其他布局类型)。此LinearLayout将用作菜单的画布:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/llMenuCanvas"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</LinearLayout>
接下来,我们希望将基本项目片段编码为抽象类,这将由所有菜单项片段实现:
public abstract class NavMenuItem extends Fragment {
static final String TAG = "yourTag"; // Debug tag
LinearLayout canvas;
View hView; // we'll keep the reference of both views
View vView;
// All we'll need to do is set these up on our fragments
abstract int getVerticalLayoutResource();
abstract int getHorizontalLayoutResource();
abstract void setupUI(); // assigns all UI elements and listeners
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.menu_base, container, false); // sets up the layout for this fragment
// keeping our references to both layout versions
hView = inflater.inflate(getHorizontalLayoutResource(), container, false);
vView = inflater.inflate(getVerticalLayoutResource(), container, false);
canvas = view.findViewById(R.id.llMenuCanvas); // this is the magic part: Our reference to the menu canvas
// returning our first view depending on orientation
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
canvas.addView(hView);
}else{
canvas.addView(vView);
}
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setupUI(); // here we set up our listeners for the first time
}
// Here we update the layout when we rotate the device
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
canvas.removeAllViews();
// Checking screen orientation
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
canvas.addView(hView);
}
else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
canvas.addView(vView);
}
setupUI(); // we always need to rebind our buttons
}
}
以下是根据设备方向旋转的菜单项片段示例。
public class NavMenuMain extends NavMenuItem{
static final String TAG = "yourTag"; // Debug tag
// Your layout references, as usual
ImageButton btnCloseMenu;
// here we set up the layout resources for this fragment
@Override
int getVerticalLayoutResource() { // vertical layout version
return R.layout.menu_main_port;
}
@Override
int getHorizontalLayoutResource() { // horizontal layout version
return R.layout.menu_main_land;
}
@Override
void setupUI(){
// Setup button listeners and layout interaction here
// REMEMBER: the names of your layout elements must match, both for landscape and portrait layouts. Ex: the "close menu" button must have the same id name in both layout versions
}
}
希望它有所帮助。
答案 3 :(得分:0)
您需要做的就是在layout-land
文件夹中打开一个新的res
文件夹,并在其中放置与您的片段布局名称相同的xml,框架将知道要查找方向更改.xml
。
查看here了解详情。
答案 4 :(得分:0)
默认情况下,/ res / layout中的布局适用于纵向和横向 如果你有例如
/res/layout/main.xml
你可以添加一个新文件夹/ res / layout-land,将main.xml复制到其中并进行必要的调整。
另请参阅http://www.androidpeople.com/android-portrait-amp-landscape-differeent-layouts和http://www.devx.com/wireless/Article/40792/1954以获取更多选项。
答案 5 :(得分:0)
后来,但这对某些人有帮助
在V4片段中尝试此操作
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (getFragmentManager() != null) {
getFragmentManager()
.beginTransaction()
.detach(this)
.attach(this)
.commit();
}
}
答案 6 :(得分:0)
更改方向时,片段会被破坏并重新创建(See this for better understanding)。因此,在onConfigurationChanged中,您可以为新的布局充气,但它没有用,因为重新创建片段时,会再次调用onCreateView。换句话说,您的旧版式再次膨胀。因此最好以这种方式执行此操作:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view;
if(getActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
view = View.inflate(getContext(), R.frag_dashboard,null);
changeview = (ShimmerTextView)view.findViewById(R.id.changeview);
} else(getActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
Toast.makeText(getContext(), "landscape", Toast.LENGTH_SHORT).show();
view = View.inflate(getContext(), R.layout.prayer_times,null);
}
return view;
}
答案 7 :(得分:0)
android:configChanges="orientation|screenSize|keyboardHidden"
将上述代码特别放入您的AndroidManifest中
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/splashScreenTheme"
android:configChanges="orientation|screenSize|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
我认为这对您有帮助。