2017-02-12 7 views
1

У меня есть следующий файл макета. В основном у меня есть карта google, и в левом верхнем углу у меня есть TextView, где мне нужно будет поддерживать счетчик каждые 15 секунд, чтобы обновить карту. Макет в порядке.Android обновляет таймер просмотра и обновляет содержимое карты?

<RelativeLayout 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" > 

    <fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:map="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/map" 
    tools:context="com.example.ns.appversion1.MapActivityFragment1" 
    android:name="com.google.android.gms.maps.SupportMapFragment"/> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" > 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" 
      android:weightSum="2" > 

      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_weight="1" 
       android:gravity="left" 
       android:padding="3dp" 
       android:id="@+id/textRefresh" 
       android:background="@drawable/border" 
       android:text="Refreshing 1" 
       android:textColor="#03A9FA" 
       android:textSize="12sp" /> 


     </LinearLayout> 
    </FrameLayout> 
</RelativeLayout> 

Ниже приведены мои коды. В функции просмотра я пытаюсь реализовать функцию Handler, чтобы сохранить счетчик. Таким образом, каждые 15 секунд я хочу вызвать функцию JSON для получения последних значений long long и графика на карте соответственно. Я теперь застрял на первом шаге здесь, где он дает мне ошибку, говоря, что переменная доступа can not timeleft, m_handlerTask и m_handler изнутри внутреннего класса? Я хочу показать счетчик вниз, чтобы пользователь узнал в течение следующих 15 секунд, что карта будет обновляться?

public class MapActivityFragment1 extends Fragment implements OnMapReadyCallback { 
    private GoogleMap mMap; 
    TextView tv; 
    // TODO: Rename parameter arguments, choose names that match 
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 
    private static final String ARG_PARAM1 = "param1"; 
    private static final String ARG_PARAM2 = "param2"; 

    // TODO: Rename and change types of parameters 
    private String mParam1; 
    private String mParam2; 

    private OnFragmentInteractionListener mListener; 

    public MapActivityFragment1() { 
     // Required empty public constructor 
    } 

    // TODO: Rename and change types and number of parameters 
    public static MapActivityFragment1 newInstance(String param1, String param2) { 
     MapActivityFragment1 fragment = new MapActivityFragment1(); 
     Bundle args = new Bundle(); 
     args.putString(ARG_PARAM1, param1); 
     args.putString(ARG_PARAM2, param2); 
     fragment.setArguments(args); 
     return fragment; 
    } 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_map_activity_fragment1, null, false); 

     SupportMapFragment mapFragment = (SupportMapFragment) this.getChildFragmentManager() 
       .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 
     tv = (TextView) getActivity().findViewById(R.id.textRefresh); 
     Handler m_handler; 
     Runnable m_handlerTask ; 
     final int timeleft=15000; 
     final m_handler = new Handler(); 
     final m_handlerTask = new Runnable() 
     { 
      @Override 
      public void run() { 
       if(timeleft>=0) 
       { 
        // do stuff 
        Log.i("timeleft",""+timeleft); 
        timeleft--; 
        tv.setText("Refreshing in "+timeleft); 

       } 
       else 
       { 
        m_handler.removeCallbacks(m_handlerTask); // cancel run 
       } 
       m_handler.postDelayed(m_handlerTask, 1000); 
      } 
     }; 
     m_handlerTask.run(); 

     return view; 
    } 
    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 
     // Add a marker in Sydney and move the camera 
     LatLng sydney = new LatLng(-34, 151); 
     mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); 
     mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); 
    } 

    // TODO: Rename method, update argument and hook method into UI event 
    public void onButtonPressed(Uri uri) { 
     if (mListener != null) { 
      mListener.onFragmentInteraction(uri); 
     } 
    } 


    public void onAttach(Context context) { 
     super.onAttach(context); 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mListener = null; 
    } 

    public interface OnFragmentInteractionListener { 
     // TODO: Update argument type and name 
     void onFragmentInteraction(Uri uri); 
    } 
} 

Я пробовал решение Чару, как показано ниже.

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_map_activity_fragment1, null, false); 

     SupportMapFragment mapFragment = (SupportMapFragment) this.getChildFragmentManager() 
       .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 
     tv = (TextView) getActivity().findViewById(R.id.textRefresh); 
     MyCount counter = new MyCount(15000, 1000); 
     counter.start(); 

     return view; 
    } 
+0

Вы говорили много. что именно вы хотите сделать;) 1.refresh map через 15 с или использовать счетчик вниз? –

+0

Я просто хочу показать счет на моем лейбле – user5313398

+0

Скажите, что это счет от 15, затем от 14 до 13 и т. Д. До 1, затем я вызываю json для обновления карты? – user5313398

ответ

1

Это демо обратный отсчет от 15 до 0 (-1 в секунду), и эта задача будет повторяться снова через каждые 15 секунд!

public class YourActivity extends Activity { 


    TextView textView; 
    android.os.Handler customHandler; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_home); 
     textView = (TextView) findViewById(R.id.text); 


     customHandler = new android.os.Handler(); 
     customHandler.postDelayed(updateTimerThread, 0); 
    } 


    // count down timer is an abstract class, so extend it and fill in methods 
    public class MyCount extends CountDownTimer { 

     public MyCount(long millisInFuture, long countDownInterval) { 
      super(millisInFuture, countDownInterval); 
     } 

     @Override 
     public void onFinish() { 
      textView.setText("done!"); 
     } 

     @Override 
     public void onTick(long millisUntilFinished) { 
      textView.setText("Left: " + millisUntilFinished/1000); 
     } 
    } 

    private Runnable updateTimerThread = new Runnable() 
    { 
     public void run() 
     { 

      // 10000 is the starting number (in milliseconds) 
      // 1000 is the number to count down each time (in milliseconds) 
      MyCount counter = new MyCount(15000, 1000); 
      counter.start(); 
      customHandler.postDelayed(this, 15000); // repeat body after 15 seconds 
     } 
    }; 
} 
+1

Комментарии не предназначены для расширенного обсуждения; этот разговор был [перемещен в чат] (http://chat.stackoverflow.com/rooms/135515/discussion-on-answer-by-charu-android-update-textview-timer-and-refresh-map-con) , –