Tech. Forum 개발자들을 위한 정보 공유의 장입니다
닫기

Tech.Forum

TMapAPI 에서 뷰 전환시 뷰 작동 정지하는 문제

#1

안녕하세요
TMapAPI 사용하여 아두이노와 통신하는 어플을 개발 중입니다. 해당 과정에서 통신을 위해 블루투스용 뷰와 TmapView를 동시에 표기하기 위해 framelayout을 사용하려고 합니다.
초기에는 tmapview가 잘 작동하나, view를 변경후 다시 접근할 시에 화면이 회색으로 변하며 작동이 중지하는 문제가 발생하여 문의 드립니다. 코드는 다음과 같습니다.

MainActivity.java
`
public class MainActivity extends AppCompatActivity {
private TMapView tMapView;
private ListView listView;
private ArrayAdapter mConversationArrayAdapter;
private int listNum = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    findViewById(R.id.button).setOnClickListener(mClickListener);

    // LinearLayout linearLayoutTmap = (LinearLayout)findViewById(R.id.linearLayoutTmap);
    listView = (ListView)findViewById(R.id.message_listview);
    mConversationArrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);
    listView.setAdapter(mConversationArrayAdapter);

    mConversationArrayAdapter.insert("test string", 0);

    tMapView = new TMapView(this);
    tMapView.setSKTMapApiKey( "앱키" );

    FrameLayout frameLayout = (FrameLayout) findViewById(R.id.view_frame);
    frameLayout.removeView(listView);

    if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED
            && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)!=PackageManager.PERMISSION_GRANTED){

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, 1); //위치권한 탐색 허용 관련 내용
        }
    }

    tMapView.setCenterPoint(37.486072, 127.019108);
    tMapView.setIconVisibility(true);
    // linearLayoutTmap.addView( tMapView );
    frameLayout.addView(tMapView);
    setGps();

    SearchPathThread thread = new SearchPathThread();
    thread.start();
}

Button.OnClickListener mClickListener = new View.OnClickListener(){
    @Override
    public void onClick(View v) {
        listNum = (listNum + 1) % 2;
        changeView(listNum);

        return;
    }
};

private void changeView(int index) {
    FrameLayout frame = (FrameLayout) findViewById(R.id.view_frame) ;
    frame.removeViewAt(0) ;

    switch (index) {
        case 0 :
            frame.addView(tMapView) ;
            break ;
        case 1 :
            frame.addView(listView) ;
            break ;
    }
}

public class SearchPathThread extends Thread{
    private static final String TAG = "SearchPathThread";
    boolean f = false;

    public void run(){
        if (!f) {
            TMapPoint tMapPointStart = new TMapPoint(37.495360, 127.037078);
            TMapPoint tMapPointEnd = new TMapPoint(37.486072, 127.019108);
            TMapData tMapData = new TMapData();
            FrameLayout frameLayoutTmap = (FrameLayout) findViewById(R.id.view_frame);

            try {
                TMapPolyLine tMapPolyLine = tMapData.findPathData(tMapPointStart, tMapPointEnd);
                tMapPolyLine.setLineColor(Color.BLUE);
                tMapPolyLine.setLineWidth(2);
                ((TMapView) frameLayoutTmap.getChildAt(0)).addTMapPolyLine("Line1", tMapPolyLine);
                f = true;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

private final LocationListener mLocationListener = new LocationListener() {
    public void onLocationChanged(Location location) {

        //현재위치의 좌표를 알수있는 부분
        if (location != null) {
            double latitude = location.getLatitude();
            double longitude = location.getLongitude();
            tMapView.setLocationPoint(longitude, latitude);
            tMapView.setCenterPoint(longitude, latitude);
            Log.d("TmapTest",""+longitude+","+latitude);
        }

    }

    public void onProviderDisabled(String provider) {
    }

    public void onProviderEnabled(String provider) {
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
};

public void setGps() {
    final LocationManager lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}, 1);
    }
    try {
        lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 1, mLocationListener);
    } catch (SecurityException e){
        e.printStackTrace();
    }
}

}`

activity_main.xml
`

<?xml version="1.0" encoding="utf-8"?>

<android.widget.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:orientation=“vertical”
tools:context=“com.skt.tmapsample.tmapview.MapDraw”>

<LinearLayout
    android:id="@+id/linearLayoutTmap"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="view 전환" />

    <LinearLayout
        android:weightSum="1"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <EditText
            android:id="@+id/input_string_edittext"
            android:hint="input text here"
            android:layout_weight="0.8"
            android:layout_width="0dp"
            android:layout_height="wrap_content"/>

        <Button
            android:id="@+id/send_button"
            android:layout_weight="0.2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="Send" />
    </LinearLayout>

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/view_frame">

        <ListView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/message_listview"/>

    </FrameLayout>
</LinearLayout>

</android.widget.LinearLayout>`

0 Likes

#2

안녕하세요.
T map API 운영담당자 입니다.

보내주신 내용을 확인해본 결과 changeView시 removeViewAt을 하여 모든 뷰를 제거한 후 index 값에 따라 해당 view를 표시하는 부분이 문제인 것을 확인하였습니다.

모든 view를 제거하면 생성된 tmapView도 삭제되기 때문에 tMapView 호출 시 지도가 나오지 않습니다.

tMapView를 addView하기 전 tMapView를 다시 생성하시면 정상적으로 지도가 표출되는 것을 확인하실 수 있습니다.

감사합니다.

0 Likes