所以我的Track.java
布局只是为了向我展示myTextLat
和myTextLong
的最新GPS坐标。一个MainActivity.java
有一个方法locationChanged
,可以在新的GPS数据可用时吐出,但无论出于何种原因,我的布局都没有使用新数据进行更新,尽管能够看到新的坐标数据即将到来超出系统中的locationChanged
。我可以通过在onCreateView中执行settext静态设置它们,但由于某种原因它们不会通过setMyCoords更新。有人可以帮我弄清楚为什么数据在可用时没有传递到我的布局中?是否有另一种更好的方法将数据从活动传递到片段中的对象,以便它们始终更新?感谢。
MainActivity的locationChanged
@Override
public void locationChanged(double longitude, double latitude) {
try {
System.out.println("Longitude: " +longitude);
System.out.println("Latitude: " + latitude);
Track f = new Track();
f.setMyCoords(latitude,longitude);
} catch (NullPointerException e) {
}
Track.java
package "";
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class Track extends Fragment {
MiddleMan mCallBack;
TextView myTextLat;
TextView myTextLong;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mCallBack = (MiddleMan) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement ReqestConnect");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.track_display, container, false);
myTextLat = (TextView) view.findViewById(R.id.textView_lat);
myTextLong = (TextView) view.findViewById(R.id.textView_long);
mCallBack.DisplayHome();
return view;
}
public void setMyCoords(final double slat, final double slong) {
myTextLat.setText(Double.toString(slat));
myTextLong.setText(Double.toString(slong));
}
}
这也可能有所帮助。调用时,每个片段都会替换MainActivity中的framelayout。它看起来像这样。
@Override
public void ShiftView(Object obj) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.activity_main_framelayout, (Fragment) obj);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();
}
实际的通话类似于。
Track f = new Track();
ShiftView(f);
结论
在Joel Min的帮助下,我能够得出结论。从用户的角度来看,我只有一个活动,但是使用几个片段来承担多个活动的角色:
activity_main.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" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:orientation="vertical" tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#27b"
android:layout_weight=".04">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/activity_main_framelayout">
</FrameLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight=".9"
android:orientation="horizontal">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#1B5F96"
android:layout_weight=".9"
android:id="@+id/activity_main_status_title"
android:text="@string/activity_main_status_title"
tools:ignore="NestedWeights" />
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#AD3333"
android:layout_weight=".15"
android:id="@+id/activity_main_status_value"
android:text="@string/activity_main_status_value"/>
</LinearLayout>
</LinearLayout>
Framelayout占据绝大多数显示器,ShiftView基本上通过调用片段类来交换片段的布局,如上所述。问题?移动视图由onOptionsitemSelected方法完成,其中每个条目基本上如下所示:
if (id == R.id.action_track_display) {
Track f = new Track();
ShiftView(f);
return true;
到目前为止,项目一直很好,但是,Track.java需要做其他类没有做的事情,它需要接收和保留gps数据,无论用户在应用程序中的位置如何。我的菜单生成一个新的Track对象,我的locationChanged方法每次位置更改时生成一个新的Track对象[这是很多对象],没有任何对象是相同的,并且没有任何方法以任何方式连接到MainActivity.java。结果,您得到一个无崩溃的应用程序,其中Track对象的布局对于永远不会更新的用户可见,并且一系列背景Track对象存在一小段时间,每个对象包含一组gps点。修复,非常简单:
MainActivity.java
public class MainActivity extends AppCompatActivity {
Track my_track;
...
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_track_display) {
if (my_track==null) {
my_track = new Track();
}
ShiftView((my_track);
return true;
}
....
@Override
public void locationChanged(final double longitude, final double latitude) {
try {
System.out.println("Main-Longitude: " +longitude);
System.out.println("Main-Latitude: " + latitude);
runOnUiThread(new Runnable() {
@Override
public void run() {
my_track.setMyCoords(latitude,longitude);
}
});
} catch (NullPointerException e) {}
答案 0 :(得分:2)
每个片段在调用
时替换MainActivity中的framelayout
但是您在创建片段后调用f.setMyCoords(latitude,longitude);
并按原样返回到主UI(未应用setMyCoords)。因此,将f.setMyCoords(latitude,longitude);
从您的locationChanged方法移至ShitView方法。当然,您需要使用全局变量tempLong
和tempLat
来临时存储locationChanged中的经度和纬度值,并在ShiftView中访问它们。以下是修改后的代码:
private double tempLong, tempLat; //declare it at class level
@Override
public void locationChanged(double longitude, double latitude) {
try {
System.out.println("Longitude: " +longitude);
System.out.println("Latitude: " + latitude);
Track f = new Track();
tempLong = longitude;
tempLat = latitude;
} catch (NullPointerException e) {
}
@Override
public void ShiftView(Object obj) {
(Fragment) obj.setMyCoords(tempLat, tempLong);
//if above line causes error try the line below;
//Track f = (Fragment) obj;
//f.setMyCoords(tempLat, tempLong);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.activity_main_framelayout, (Fragment) obj);
//ft.replace(R.id.activity_main_framelayout, f);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();
}
我无法保证上述代码能够正常运行,因为我没有完整的代码。但基本上你需要在主活动中的片段转换发生之前设置经度和纬度,或者在setMyCoords方法中设置回调机制,这样当它被调用时它会调用主活动以使用new long更新textviews。和lat。
答案 1 :(得分:0)
您似乎从NOT ui线程调用setText。 考虑使用像这样的smth在UI线程中调用它:
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
myTextLat.setText(Double.toString(slat));
myTextLong.setText(Double.toString(slong));
}
});