片段是否相互叠加?

时间:2016-08-23 18:27:20

标签: java android android-layout android-fragments

这可能是重复的,但坦率地说,其他问题都没有帮助我。

所以我有一个问题。我正在制作一个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>

2 个答案:

答案 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可以很好地完成这项工作。