我试图制作可以改变上下文部分的按钮,但是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>
但我得到了这个:
而不是匹配父亲的宽度/身高。
答案 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