android 片段中的 Textview 在横向布局中重复
Textview in android fragment duplicated in landscape layout
我正在尝试制作一个包含两个片段的应用程序,一个包含组列表(称为 OverviewFragment),另一个片段包含所选组的详细信息(称为 DetailsFragment)。我希望在纵向模式下一次只显示一个片段,在横向模式下同时显示两个片段。
我有两个问题。首先,纵向和横向之间的转换非常不稳定,会导致各种崩溃,即:黑屏、"No view found"、"Error inflating class fragment" 和 "overlapping rendering"。
我的另一个更具体的问题是,在横向模式下,包含组名称的文本视图被复制并添加到布局的顶部。对我来说这很奇怪,因为另一个文本视图(包含组信息)不会被复制。很费解!
运行 仅纵向模式下的应用程序运行良好,我没有遇到崩溃或重复文本视图的情况。
MainActivity.java
package com.example.o2k.lab2naviedition;
import android.net.Uri;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements OverviewFragment.OnOverviewInteractionListener, DetailsFragment.OnDetailsInteractionListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) { // if we are being restored we dont need to do stuff
System.out.println("saved");
return;
}
System.out.println("tag is: "+findViewById(R.id.activity_main).getTag());
if (findViewById(R.id.activity_main).getTag().equals("portrait")) {
OverviewFragment overFrag = new OverviewFragment();
System.out.println("PORTRAIT IF ---------------------");
// Add the fragment to the 'fragment_container' FrameLayout
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, overFrag).commit();
} else if (findViewById(R.id.activity_main).getTag().equals("landscape")) {
System.out.println("LANDSCAPE IF ---------------------");
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.overview_fragment, new OverviewFragment());
transaction.replace(R.id.details_fragment, new DetailsFragment());
transaction.commit();
}
}
@Override
public void onOverviewInteraction(int position) {
DetailsFragment detailsFrag = (DetailsFragment)
getSupportFragmentManager().findFragmentById(R.id.details_fragment);
Group group = OverviewFragment.getGroups()[position];
DetailsFragment newFragment = new DetailsFragment();
Bundle args = new Bundle();
args.putString("groupName", group.getName());
args.putString("groupInfo", group.getInfo());
newFragment.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if (detailsFrag != null) {
transaction.replace(R.id.details_fragment, newFragment);
} else {
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
}
transaction.commit();
}
@Override
public void onDetailsInteraction(Uri uri) {
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:configChanges="keyboardHidden|orientation|screenSize"
android:id="@+id/activity_main"
android:tag="portrait"
tools:context="com.example.o2k.lab2naviedition.MainActivity">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/fragment_container">
</FrameLayout>
</LinearLayout>
activity_main.xml(土地)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:configChanges="keyboardHidden|orientation|screenSize"
android:orientation="horizontal"
android:id="@+id/activity_main"
android:tag="landscape">
<fragment android:name="com.example.o2k.lab2naviedition.OverviewFragment"
android:id="@+id/overview_fragment"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
<fragment android:name="com.example.o2k.lab2naviedition.DetailsFragment"
android:id="@+id/details_fragment"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent" />
</LinearLayout>
OverviewFragment.java
package com.example.o2k.lab2naviedition;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class OverviewFragment extends ListFragment {
private OnOverviewInteractionListener mListener;
private static Group[] groups = {new Group("group 1", "5"), new Group("group 2", "13"),
new Group("group 3", "12"), new Group("group 4", "32"), new Group("group 5", "45")};
public OverviewFragment() {
}
public static OverviewFragment newInstance(String param1, String param2) {
OverviewFragment fragment = new OverviewFragment();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int layout = android.R.layout.simple_list_item_1;
List<String> groupNames = new ArrayList();
for (Group g: groups
) {
groupNames.add(g.getName());
}
setListAdapter(new ArrayAdapter<String>(getActivity(), layout, groupNames));
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_overview, container, false);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
mListener.onOverviewInteraction(position);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnOverviewInteractionListener) {
mListener = (OnOverviewInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnOverviewInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public interface OnOverviewInteractionListener {
void onOverviewInteraction(int position);
}
public static Group[] getGroups() {
return groups;
}
}
DetailsFragment.java
package com.example.o2k.lab2naviedition;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class DetailsFragment extends Fragment {
private OnDetailsInteractionListener mListener;
private String groupName;
private String groupInfo;
public DetailsFragment() {
}
public static DetailsFragment newInstance() {
DetailsFragment fragment = new DetailsFragment();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_details, container, false);
TextView groupNameTextView = (TextView)v.findViewById(R.id.groupNameText);
TextView groupInfoTextView = (TextView)v.findViewById(R.id.groupInfoText);
if (this.getArguments() != null) {
groupName = this.getArguments().getString("groupName");
groupInfo = this.getArguments().getString("groupInfo");
} else {
groupName = "<emptyNAME>";
groupInfo = "<emptyINFO>";
}
groupInfoTextView.setText("No of members: "+groupInfo);
groupNameTextView.setText(groupName);
return v;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnDetailsInteractionListener) {
mListener = (OnDetailsInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnDetailsInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public interface OnDetailsInteractionListener {
void onDetailsInteraction(Uri uri);
}
}
尝试使用 FrameLayouts 而不是 xml 文件中的自定义片段:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:configChanges="keyboardHidden|orientation|screenSize"
android:orientation="horizontal"
android:id="@+id/activity_main"
android:tag="landscape">
<FrameLayout
android:id="@+id/overview_fragment"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
<FrameLayout
android:id="@+id/details_fragment"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent" />
</LinearLayout>
以您的方式,您正在创建每个片段两次。
祝你好运:)
我正在尝试制作一个包含两个片段的应用程序,一个包含组列表(称为 OverviewFragment),另一个片段包含所选组的详细信息(称为 DetailsFragment)。我希望在纵向模式下一次只显示一个片段,在横向模式下同时显示两个片段。
我有两个问题。首先,纵向和横向之间的转换非常不稳定,会导致各种崩溃,即:黑屏、"No view found"、"Error inflating class fragment" 和 "overlapping rendering"。
我的另一个更具体的问题是,在横向模式下,包含组名称的文本视图被复制并添加到布局的顶部。对我来说这很奇怪,因为另一个文本视图(包含组信息)不会被复制。很费解!
运行 仅纵向模式下的应用程序运行良好,我没有遇到崩溃或重复文本视图的情况。
MainActivity.java
package com.example.o2k.lab2naviedition;
import android.net.Uri;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements OverviewFragment.OnOverviewInteractionListener, DetailsFragment.OnDetailsInteractionListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) { // if we are being restored we dont need to do stuff
System.out.println("saved");
return;
}
System.out.println("tag is: "+findViewById(R.id.activity_main).getTag());
if (findViewById(R.id.activity_main).getTag().equals("portrait")) {
OverviewFragment overFrag = new OverviewFragment();
System.out.println("PORTRAIT IF ---------------------");
// Add the fragment to the 'fragment_container' FrameLayout
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, overFrag).commit();
} else if (findViewById(R.id.activity_main).getTag().equals("landscape")) {
System.out.println("LANDSCAPE IF ---------------------");
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.overview_fragment, new OverviewFragment());
transaction.replace(R.id.details_fragment, new DetailsFragment());
transaction.commit();
}
}
@Override
public void onOverviewInteraction(int position) {
DetailsFragment detailsFrag = (DetailsFragment)
getSupportFragmentManager().findFragmentById(R.id.details_fragment);
Group group = OverviewFragment.getGroups()[position];
DetailsFragment newFragment = new DetailsFragment();
Bundle args = new Bundle();
args.putString("groupName", group.getName());
args.putString("groupInfo", group.getInfo());
newFragment.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if (detailsFrag != null) {
transaction.replace(R.id.details_fragment, newFragment);
} else {
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
}
transaction.commit();
}
@Override
public void onDetailsInteraction(Uri uri) {
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:configChanges="keyboardHidden|orientation|screenSize"
android:id="@+id/activity_main"
android:tag="portrait"
tools:context="com.example.o2k.lab2naviedition.MainActivity">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/fragment_container">
</FrameLayout>
</LinearLayout>
activity_main.xml(土地)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:configChanges="keyboardHidden|orientation|screenSize"
android:orientation="horizontal"
android:id="@+id/activity_main"
android:tag="landscape">
<fragment android:name="com.example.o2k.lab2naviedition.OverviewFragment"
android:id="@+id/overview_fragment"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
<fragment android:name="com.example.o2k.lab2naviedition.DetailsFragment"
android:id="@+id/details_fragment"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent" />
</LinearLayout>
OverviewFragment.java
package com.example.o2k.lab2naviedition;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class OverviewFragment extends ListFragment {
private OnOverviewInteractionListener mListener;
private static Group[] groups = {new Group("group 1", "5"), new Group("group 2", "13"),
new Group("group 3", "12"), new Group("group 4", "32"), new Group("group 5", "45")};
public OverviewFragment() {
}
public static OverviewFragment newInstance(String param1, String param2) {
OverviewFragment fragment = new OverviewFragment();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int layout = android.R.layout.simple_list_item_1;
List<String> groupNames = new ArrayList();
for (Group g: groups
) {
groupNames.add(g.getName());
}
setListAdapter(new ArrayAdapter<String>(getActivity(), layout, groupNames));
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_overview, container, false);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
mListener.onOverviewInteraction(position);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnOverviewInteractionListener) {
mListener = (OnOverviewInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnOverviewInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public interface OnOverviewInteractionListener {
void onOverviewInteraction(int position);
}
public static Group[] getGroups() {
return groups;
}
}
DetailsFragment.java
package com.example.o2k.lab2naviedition;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class DetailsFragment extends Fragment {
private OnDetailsInteractionListener mListener;
private String groupName;
private String groupInfo;
public DetailsFragment() {
}
public static DetailsFragment newInstance() {
DetailsFragment fragment = new DetailsFragment();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_details, container, false);
TextView groupNameTextView = (TextView)v.findViewById(R.id.groupNameText);
TextView groupInfoTextView = (TextView)v.findViewById(R.id.groupInfoText);
if (this.getArguments() != null) {
groupName = this.getArguments().getString("groupName");
groupInfo = this.getArguments().getString("groupInfo");
} else {
groupName = "<emptyNAME>";
groupInfo = "<emptyINFO>";
}
groupInfoTextView.setText("No of members: "+groupInfo);
groupNameTextView.setText(groupName);
return v;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnDetailsInteractionListener) {
mListener = (OnDetailsInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnDetailsInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public interface OnDetailsInteractionListener {
void onDetailsInteraction(Uri uri);
}
}
尝试使用 FrameLayouts 而不是 xml 文件中的自定义片段:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:configChanges="keyboardHidden|orientation|screenSize"
android:orientation="horizontal"
android:id="@+id/activity_main"
android:tag="landscape">
<FrameLayout
android:id="@+id/overview_fragment"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
<FrameLayout
android:id="@+id/details_fragment"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent" />
</LinearLayout>
以您的方式,您正在创建每个片段两次。 祝你好运:)