2017-12-07 2 views
-4

다음은 MPAndroid 라이브러리 버전 3을 사용하는 그룹 bar_chart에 사용 된 코드입니다. 하위 버전에서 그룹 막 대형 차트를 시도했지만 올바르게 작동하지만 BarData 생성자가 최신 버전에서 변경되었습니다. 그리고이 코드는 작동하지 않습니다. 크래시 및 오류 로그가 없으며 여전히 그래프가로드 중이며 데이터가 표시되지 않습니다. 엄마 결함을 찾기 위해 도와주세요MPAndroid 그룹 막 대형 차트가 표시되지 않습니다

 List<BarEntry> entriesGroup1 = new ArrayList<>(); 
     List<BarEntry> entriesGroup2 = new ArrayList<>(); 
     List<BarEntry> entriesGroup3 = new ArrayList<>(); 

     entriesGroup1.add(new BarEntry(0, 8f)); 
     entriesGroup1.add(new BarEntry(1, 2f)); 
     entriesGroup1.add(new BarEntry(2, 5f)); 
     entriesGroup1.add(new BarEntry(3, 20f)); 
     entriesGroup1.add(new BarEntry(4, 15f)); 
     entriesGroup1.add(new BarEntry(5, 19f)); 

     entriesGroup2.add(new BarEntry(0, 6f)); 
     entriesGroup2.add(new BarEntry(1, 10f)); 
     entriesGroup2.add(new BarEntry(2, 5f)); 
     entriesGroup2.add(new BarEntry(3, 25f)); 
     entriesGroup2.add(new BarEntry(4, 4f)); 
     entriesGroup2.add(new BarEntry(5, 17f)); 

     entriesGroup3.add(new BarEntry(0, 9f)); 
     entriesGroup3.add(new BarEntry(1, 1f)); 
     entriesGroup3.add(new BarEntry(2, 15f)); 
     entriesGroup3.add(new BarEntry(3, 13f)); 
     entriesGroup3.add(new BarEntry(4, 40f)); 
     entriesGroup3.add(new BarEntry(5, 25f)); 

     BarDataSet set1 = new BarDataSet(entriesGroup1, "Group 1"); 
     BarDataSet set2 = new BarDataSet(entriesGroup2, "Group 2"); 
     BarDataSet set3 = new BarDataSet(entriesGroup3, "Group 3"); 

     final ArrayList<String> labels = new ArrayList<String>(); 
     labels.add("2016"); 
     labels.add("2015"); 
     labels.add("2014"); 
     labels.add("2013"); 
     labels.add("2012"); 
     labels.add("2011"); 
     IAxisValueFormatter formatter = new IAxisValueFormatter() { 

      @Override 
      public String getFormattedValue(float value, AxisBase axis) { 

       if((int) value < 0 || (int) value >= labels.size()){ 
        return ""; 
       }else{ 
        return labels.get((int) value); 
       } 
      } 

      // we don't draw numbers, so no decimal digits needed 
      @Override 
      public int getDecimalDigits() { return 0; } 
     }; 

     set1.setColor(Color.parseColor("#cd5080")); 
     set2.setColor(Color.parseColor("#0d5080")); 
     set3.setColor(Color.parseColor("#fc5080"));; 

     float groupSpace = 0.06f; 
     float barSpace = 0.02f; // x2 dataset 
     float barWidth = 0.45f; // x2 dataset 
// (0.02 + 0.45) * 2 + 0.06 = 1.00 -> interval per "group" 

     XAxis xAxis = barChart.getXAxis(); 
     xAxis.setCenterAxisLabels(true); 
     xAxis.setGranularity(1f); // minimum axis-step (interval) is 1 
     xAxis.setValueFormatter(formatter); 

     BarData data = new BarData(set1, set2, set3); 
     data.setBarWidth(barWidth); // set the width of each bar 
     barChart.setData(data); 
     barChart.groupBars(2016, groupSpace, barSpace); 
     barChart.invalidate(); // refresh 

     barChart.animateY(5000); 

을주의 : 나는 새 질문을 금지하고있어 이후 현재의 내 질문을 편집하고 있습니다. 그러나 나를 위해 그것의 중요성. 모두에게 감사드립니다. 카운터가있는 경우

+0

@Nilu에서 유를 실행중인 모든 activitys의 목록을 제공합니다. 내 프로젝트에는 약 87 개의 활동 페이지가 있으므로 onPause 및 onResume을 포함하도록 모든 활동에서 편집해야합니까? 아니면 다른 방법으로? –

+0

이것을 확인하십시오 https://tips.androidhive.info/2015/04/android-how-to-check-if-the-app-is-in-background-or-foreground/ –

+2

'... 거의 87 활동 페이지 ... '이런 젠장! 왜 그렇게 많은 액티비티를 사용합니까? 단편과 하나 또는 몇 개의 액티비티를 사용할 수 있습니다. –

답변

1

0activity

class MyApp extends Application{ 
public int foregroundActivities = 0 ; 

@override 
public void onCreate(){ 
    super.onCreate(); 
    this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { 

       @Override 
       public void onActivityStarted(Activity activity) { 
        foregroundActivities++; 
       } 

       @Override 
       public void onActivityStopped(Activity activity) { 
        foregroundActivities--; 
       } 
     } 
    } 
} 

가 귀하의 질문에 대답 편집, Application 클래스가 싱글 톤 배경에 의미 전경 활동의 카운터를 Application 클래스를 만들고 추가 라이프 사이클 (Lifecycle). 위와 같이 활동 라이프 사이클 콜백을 등록 할 수 있으므로 모든 87 가지 활동에 의해 트리거됩니다. 당신의 87 activities 중 하나가 시작되면 activity가 닫히는 경우 가정하자

, , 그것은에 전경 활동의 수를 다시 감소 할이 onActivityStopped()를 호출, 전경 활동의 횟수가 1 될 것 onActivityStarted() 메소드를 호출합니다 0.

그래서 당신은 당신은 활동 hasWindowFocus() 부울 방법을 사용할 수 있습니다, 응용 프로그램 카운터를 기반으로 전경 또는 배경에 있는지 여부를

if(applicationInstance.foregroundActivities > 0){ 
    //App is in foreground 
}else{ 
    //App is in background 
} 
+0

나는 이미 응용 프로그램 클래스를 가지고 있습니다. oncreate에서, 그것은 나에게 새 것처럼 보인다. 이 코드의 흐름을 설명 할 수 있습니까? –

+0

응용 프로그램 클래스 –

+0

에 감사의 말로 활동 라이프 사이클 콜백 기능을 설명하는 설명을 추가했습니다. 한 가지 더 의심 스럽습니다. 마지막 활동을 끝내고 이전 활동으로 돌아 가면 어떻게 될까요? 0 또는 1로 표시합니까? –

0

을 감지 할 수 있습니다. 그런 다음 포커스가있는 경우 활동에서 팝업을 표시하고 그렇지 않으면 알림 만 표시합니다.

+0

그것은 나를 위해 잘 작동하지 않습니다. 감사합니다 –

+0

감사합니다. 나는 새로운 질문을하는 것을 금지하고 있기 때문에 질문을 변경했다. 그리고 지금 나를위한 중요한 의심은 당신이 이해할 수 있기를 바랍니다. –

1

이것은 내 대답이 아니며 이전에이 ques를 보았고 내 응용 프로그램에 impleneted되어 매력처럼 작동했습니다. 내가 사용한 코드를 게시 할 원본 링크에 대한 링크를 찾을 수 없습니다. 당신은 ActivityLifecycleCallbacks 사용할 수 있습니다

public class AppTransitionStatus implements Application.ActivityLifecycleCallbacks { 

private static final long MAX_BACKGROUND_TIME = 2000; 
private Timer timer; 
private TimerTask task; 
private boolean isBackground; 

private final Transition transition; 

private void goToForeground(Activity iActivity) { 
    transition.appToForeground(iActivity); 
} 

private void goToBackground() { 
    transition.appToBackground(); 
} 

private void stopTimer() { 
    if (task != null) task.cancel(); 
    if (timer != null) timer.cancel(); 
} 

public AppTransitionStatus(@NonNull Transition transition) { 
    this.transition = transition; 
} 

@Override 
public void onActivityCreated(Activity activity, Bundle bundle) { 

} 

@Override 
public void onActivityStarted(Activity activity) { 

} 

@Override 
public void onActivityResumed(Activity activity) { 
    if (isBackground) { 
     goToForeground(activity); 
    } 
    stopTimer(); 
    isBackground = false; 
} 

@Override 
public void onActivityPaused(Activity activity) { 
    timer = new Timer(); 
    task = new TimerTask() { 
     public void run() { 
      isBackground = true; 
      goToBackground(); 
     } 
    }; 
    timer.schedule(task, MAX_BACKGROUND_TIME); 
} 

@Override 
public void onActivityStopped(Activity activity) { 

} 

@Override 
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { 

} 

@Override 
public void onActivityDestroyed(Activity activity) { 

} 

public interface Transition { 
    void appToForeground(Activity iActivity); 

    void appToBackground(); 
} 
} 

을 그리고 당신은 응용 프로그램 클래스에

registerActivityLifecycleCallbacks(new AppTransitionStatus(new AppTransitionStatus.Transition() { 
     @Override 
     public void appToForeground(Activity iActivity) { 

      Log.d("Transition", "App in Foreground"); 

     } 

     @Override 
     public void appToBackground() { 
      Log.d("Transition", "App in Background"); 
     } 
    })); 
+0

감사합니다. 나는 새로운 질문을하는 것을 금지하고 있기 때문에 질문을 변경했다. 그리고 지금 나를위한 중요한 의심은 당신이 이해할 수 있기를 바랍니다. –

1

사용 타격 코드를이 등록 할 수 있습니다 :

public boolean isActivityRunning(Context context) { 
    boolean isActivityFound = false; 
    ActivityManager activityManager = (ActivityManager)context.getSystemService (Context.ACTIVITY_SERVICE); 
    List<ActivityManager.RunningTaskInfo> activitys = activityManager.getRunningTasks(Integer.MAX_VALUE); 

    for (int i = 0; i < activitys.size(); i++) { 
     if (activitys.get(i).topActivity.toString().equalsIgnoreCase("ComponentInfo{com.example.testapp/com.example.testapp.Your_Activity_Name}")) { 
      isActivityFound = true; 
     } 
    } 
    return isActivityFound; 
} 

여기 com.example.testapp이 패키지됩니다 이름

매니페스트에 권한을 추가해야합니다. ..

<uses-permission android:name="android.permission.GET_TASKS"/> 

실행중인 활동은 이름을 사용하여 실행 중이고 필요에 따라 변경됩니다.

public static ArrayList<ActivityInfo> getAllRunningActivities(Context context) { 
try { 
    PackageInfo pi = context.getPackageManager().getPackageInfo(
      context.getPackageName(), PackageManager.GET_ACTIVITIES); 

    return new ArrayList<>(Arrays.asList(pi.activities)); 

} catch (PackageManager.NameNotFoundException e) { 
    e.printStackTrace(); 
    return null; 
} 
} 

이 방법

UPDATE 프로젝트 나는이 대답을 본 적이

+0

전체 응용 프로그램에서 작동합니까? –

+0

예 어떤 클래스도 실행 여부를 감지하기 위해 작동합니다. –

+0

"ComponentInfo {com.example.testapp/com.example.testapp.Your_Activity_Name}"에 사용되는 내용입니다. 나는 여기에 모든 활동 이름을 추가해야합니까? 하지만 대체 솔루션이 필요합니다. –

관련 문제