match_parent不工作xml android

时间:2014-12-25 14:27:57

标签: android xml

我试图制作可以改变上下文部分的按钮,但是match_parent不能正常工作。

获得java主文件:

class public MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setIcon(R.drawable.ic_launcher);

        Button bn1 = (Button) findViewById(R.id.navbar_1);
        Button bn2 = (Button) findViewById(R.id.navbar_2);

        bn1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentMeters fr = new FragmentMeters();
                FragmentManager fm = getFragmentManager();
                FragmentTransaction ft = fm.beginTransaction();
                ft.replace(R.id.layout_to_replace, fr);
                ft.commit();

            }
        });

        bn2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentValues fr = new FragmentValues();
                FragmentManager fm = getFragmentManager();
                FragmentTransaction ft = fm.beginTransaction();
                ft.replace(R.id.layout_to_replace, fr);
                ft.commit();



            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

}

然后是另一个java类FragmentMeters(和类似的FragmentValues):

public class FragmentMeters extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_meters, null);

        return view;
    }

}

主要的XML,像这样:

<LinearLayout
    android:id="@+id/navbar"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="82dp"
    android:background="@color/highlighted_text_material_dark"
    android:weightSum="4">

    <Button
        android:id="@+id/navbar_1"
        android:text="@string/navbar_1"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:textSize="13sp"
        android:background="@android:color/transparent"
        android:gravity="bottom|center_horizontal" />
    <Button
        android:id="@+id/navbar_2"
        android:text="@string/navbar_2"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:textSize="13sp"
        android:background="@android:color/transparent"
        android:gravity="bottom|center_horizontal" />
</LinearLayout>

<LinearLayout
    android:id="@+id/layout_to_replace"
    android:orientation="horizontal"
    android:layout_below="@+id/navbar"
    android:layout_width="match_parent"
    android:background="@color/dim_foreground_disabled_material_dark"
    android:layout_height="82dp"
    android:weightSum="4"/>

我试图用这个fragment_meters.xml替换LinearLayout(id =&#34; layout_to_replace&#34;):

 <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_below="@+id/navbar"
        android:layout_width="match_parent"
        android:layout_height="82dp"
        android:background="@color/dim_foreground_disabled_material_dark"
        android:weightSum="4">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="METERS"/>

    </LinearLayout>

但我得到了这个:

enter image description here

而不是匹配父亲的宽度/身高。

4 个答案:

答案 0 :(得分:2)

我知道这个问题,在某些情况下,当扩充布局时,参数layout_width和layout_height会更改为包装内容。

我建议你在充气后手动设置布局参数:

View view = inflater.inflate(R.layout.fragment_meters, null);
view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));

(高度放你想要的东西)

答案 1 :(得分:0)

从标识为android:weightSum="4"的{​​{1}}删除LinearLayout可以解决您的问题。

您还应该考虑在相应的@+id/layout_to_replace上添加gravity属性。

答案 2 :(得分:0)

最好的方法是在名为dimens.xml的values文件夹中添加资源文件,并添加一个维度,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <dimen name="width">100dp</dimen>
    <dimen name="height">100dp</dimen>
</resources>

并且在java代码中,您应该按上下文从资源中获取这些值,如下所示:

int width = getApplicationContext().getResources().getDimension(R.dimen.width);
int height = getApplicationContext().getResources().getDimension(R.dimen.height);

答案 3 :(得分:0)

@tomáš-john,问题与@ liran-peretz假设完全一样:fragment_meters的视图在运行时没有"match_parent"。但解决方案应该是不同的。

原因是当您在null中对此视图进行充气时,将FragmentMeters作为“查看根”传递!如果在通货膨胀时没有传递“查看根” - 那么fragment_meters xml中“根元素”的布局参数将被忽略,因此"match_parent"中不是LinearLayout

相反,你必须这样做: inflater.inflate(R.layout.fragment_meters, parent)

或将attachToRoot设置为false (当您不希望将视图添加到父级时) inflater.inflate(R.layout.fragment_meters, parent, false);

以下答案中的更多链接也可能有所帮助: https://stackoverflow.com/a/25528527/3134602