这可能是重复的,但坦率地说,其他问题都没有帮助我。
所以我有一个问题。我正在制作一个Contacts Android应用程序。当我按联系人查看它的号码时,只显示一个号码。通常这很好,因为大多数人没有一个联系人的多个号码。但是当你这样做时,你想看到所有的数字。这是我的问题。我希望显示多个数字,但它不起作用。
只显示一个数字,但是从调试开始,我知道实际数字变量存在的事实,它们只是没有正确显示。所以这让我相信这两个片段正相互叠加。是的,它们被添加到的布局是LinearLayout。
那么,为什么我的片段被添加到彼此之上呢?我正在使用支持片段和支持片段管理器btw。我一直试图解决这个问题几天。老实说,我讨厌直接问,但这次我不知道我做错了什么。所以,如果有人能在这里帮助我,那就太好了。
以下是代码:
ContactActivity.java
//Create an intent
Intent intent = getIntent();
Bundle extras = intent.getExtras();
//Get extras
String contact_title = extras.getString("contact_title");
String[] contact_numbers = extras.getStringArray("contact_numbers");
...
...
//Add numbers
if(contact_numbers != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction trans = fragmentManager.beginTransaction();
//Add fragments
for(int i = 0; i < contact_numbers.length; i++) {
trans.add(R.id.contact_numbers, ContactNumberFragment.newInstance("contact_number", contact_numbers[i]), "ID: " + Integer.toString(i));
}
trans.commit();
}
ContactNumberFragment.java
//Adds an extra
public static ContactNumberFragment newInstance(String name, String text) {
ContactNumberFragment fragment = new ContactNumberFragment();
//Add extras
Bundle bundle = new Bundle();
bundle.putString(name, text);
fragment.setArguments(bundle);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_contact_number, container, false);
Bundle extras = getArguments();
String number = extras.getString("contact_number");
Log.i("NUMBER", number);
contactNumber_textView = (TextView)v.findViewById(R.id.contactNumber_textView);
//Set number text
if(contactNumber_textView != null) {
contactNumber_textView.setText(number);
Log.i("TEXT VIEW TEXT", contactNumber_textView.getText().toString());
}
return v;
}
activity_contact.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
layout="@layout/toolbar"
android:id="@+id/toolbar" />
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/contact_numbers"
android:layout_below="@id/toolbar">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/contactNumberTitle_title"
android:textColor="@color/textDarkLight"
android:textSize="@dimen/contactNumberTitle_textSize"
android:paddingStart="@dimen/mediumPadding"
android:paddingLeft="@dimen/mediumPadding"
android:paddingRight="@dimen/mediumPadding"
android:paddingTop="@dimen/smallPadding"
android:paddingBottom="@dimen/smallPadding" />
</LinearLayout>
</RelativeLayout>
fragment_contact_number.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="ContactNumberFragment">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/contactNumber_textView"
android:text=""
android:textColor="@color/textDark"
android:textSize="@dimen/contactNumber_textSize"
android:padding="@dimen/smallPadding" />
</LinearLayout>
答案 0 :(得分:1)
我建议只使用自定义ViewGroup,而不是在这里使用Fragment。对于示例,我使用了LinearLayout:
public class PhoneView extends LinearLayout {
private TextView numberView;
private ImageView phoneIcon;
public PhoneView(Context context) {this(context, null);}
public PhoneView(Context context, AttributeSet attrs) {this(context, attrs, 0);}
public PhoneView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
setOrientation(HORIZONTAL);
LayoutInflater inflater = LayoutInflater.from(getContext());
View view = inflater.inflate(R.layout.view_phone, this, true);
numberView = (TextView) view.findViewById(R.id.contact_number);
phoneIcon = (ImageView) view.findViewById(R.id.phone_icon);
phoneIcon.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
callNumber();
}
});
}
public void setContactNumber(String number) {
numberView.setText(number);
}
private void callNumber() {
//...
}
}
制作匹配的布局文件view_phone.xml
:
<?xml version="1.0" encoding="utf-8"?>
<merge
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/contact_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<ImageView
android:id="@+id/phone_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon_phone"
/>
</merge>
然后在您的活动中,您只需要执行以下操作:
public void addNumbers(List<String> contactNumbers) {
LinearLayout numberLayout = (LinearLayout) findViewById(R.id.contact_numbers);
for (String number : contactNumbers) {
PhoneView phoneView = new PhoneView(this);
phoneView.setContactNumber(number);
numberLayout.addView(phoneView);
}
}
答案 1 :(得分:0)
你是对的,你是在旧的上面添加新的片段。 trans.add
将片段插入到指定的视图中。 trans.replace
会插入片段替换以前的片段,但我猜这不是你在这里想做的事情。在行之间阅读似乎要显示数字列表?如果是这种情况,您可以随时将视图添加到现有布局中,如另一个答案所示。 This问题会让你朝着正确的方向前进。没有一个好的旧ListView可以很好地完成这项工作。