我正在尝试使用'RangeSeekBar'(https://code.google.com/p/range-seek-bar/)。这必须在代码而不是XML中完成,所以我按照指示将示例代码插入到我的activity的onCreate方法中。
我的代码在下面概述的findViewById
方法中分崩离析。使用示例代码,我得到以下两个结果:
如果我尝试通过引用它的ID直接获取LinearLayout,我会得到一个空指针异常。我希望这提供LinearLayout,我不明白为什么这是null。
如果我引用R.id.container
,我可以插入RangeSeekBar,但它与第一个字段重叠。请注意,如果我尝试将容器转换为LinearLayout而不是ViewGroup,我会收到一个错误,指示容器是FrameLayout,它告诉我容器不是我想要的容器。
我的问题是,如何将RangeSeekBar插入到ViewGroup片段中,以便它遵循LinearLayout?或者,如何从onCreate和on活动中检索我的片段LinearLayout避免空指针异常?
更新:我之前已经列出了片段xml而不是活动xml。我已用下面的XML更新了这个问题。
这是我的onCreate方法:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_manage_seeds);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction().add(R.id.container, new PlaceholderFragment()).commit();
}
// I replaced the sample code's "context" with getBaseContext() should this be something else??
//RangeSeekBar<Integer> seekBar = new RangeSeekBar<Integer>(20, 75, context); //CODE SAMPLE
RangeSeekBar<Integer> seekBar = new RangeSeekBar<Integer>(0, 40, getBaseContext()); //MY VERSION
seekBar.setOnRangeSeekBarChangeListener(new OnRangeSeekBarChangeListener<Integer>() {
@Override
public void onRangeSeekBarValuesChanged(RangeSeekBar<?> bar, Integer minValue, Integer maxValue) {
// handle changed range values
Log.i(TAG, "User selected new range values: MIN=" + minValue + ", MAX=" + maxValue);
}
});
// add RangeSeekBar to pre-defined layout
//ViewGroup layout = (ViewGroup) findViewById(<your-layout-id>); //SAMPLE CODE
ViewGroup layout = (ViewGroup) findViewById(R.id.container); //MY CODE THAT SORT OF WORKS
layout.addView(seekBar); // This inserts the RangeSeekBar overlapping the Name field
//ViewGroup layout = (ViewGroup) findViewById(R.id.layout_manage); //MY CODE THAT RETURNS A NULL POINTER EXCEPTION AT RUNTIME
//layout.addView(seekBar); // This causes the null pointer exception because the line above returns null.
}
这是我的片段XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout_manage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText android:id="@+id/test_edit_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/test_edit_name" />
<EditText android:id="@+id/test_edit_type"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/test_edit_type" />
<!-- I want the custom RangeSeekBar added here. Must be done via java code, not possible through XML -->
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/test_button_save"
android:layout_gravity="right" />
</LinearLayout>
这是我的activity_manage_seeds xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.mypackage.myapp.ManageSeedsActivity"
tools:ignore="MergeRootFrame" />
答案 0 :(得分:2)
我认为更简洁的解决方案是将FrameLayout添加到现有的LinearLayout中,并将RangeSeekBar添加到FrameLayout中。见下文:
<!-- Activity Layout -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout_manage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText android:id="@+id/test_edit_name"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText android:id="@+id/test_edit_type"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<!-- This is the container for the RangeSeekBar -->
<FrameLayout
android:id="@+id/range_seek_bar_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right" />
</LinearLayout>
你的onCreate()方法可能如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RangeSeekBar rangeSeekBar = new RangeSeekBar<Integer>(20, 75, context);
ViewGroup rangeBarContainer = (ViewGroup) findViewById(R.id.range_seek_bar_container);
rangeBarContainer.addView(rangeSeekBar);
}
这使得编辑RangeSeekBar的布局属性
变得更加容易<强>更新强>
在阅读新代码后,我发现您正在尝试从Activity
代码编辑其中一个片段的布局。你不应该这样做。在PlaceholderFragment
内工作。
PlaceholderFragment
中的onCreateView()方法:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.your_fragment_layout, container, false);
RangeSeekBar rangeSeekBar = new RangeSeekBar<Integer>(20, 75, context);
ViewGroup rangeBarContainer = (ViewGroup) rootView.findViewById(R.id.range_seek_bar_container);
rangeBarContainer.addView(rangeSeekBar);
return rootView;
}
答案 1 :(得分:1)
1)当您尝试访问不在布局文件中的View(activity_manage_seeds)时,会发生NullPointerExcption。
请确保您的Viewgroup layout_manage位于activity_manage_seeds.xml文件中。
2)关于您的搜索栏位置,您需要添加布局参数以设置其正确的位置,前提是您查看了组R.id.container驻留在activity_manage_seeds.xml中,该文件不在上面显示的xml文件中。
答案 2 :(得分:0)
您在代码中遇到线性布局ID错误,请尝试将其更改为layout_manage而不是容器。
答案 3 :(得分:0)
您正在尝试获取一个不在您的xml上的View,这就是为什么它返回nullpointer ..
更改此布局:
setContentView(R.layout.activity_manage_seeds);
到id R.id.container
所在的布局