2016-03-07 31 views
-6

在片段中我想打開一個新的活動,但類是通過字符串提取的。 在toast中接收myclass.class,但不能打開一個新類,並且如果從一個新類中更改「c」,則代碼工作正常。 謝謝。從類字符串中打開一個新的活動。類null

代碼:

if (item instanceof Movie) { 
      Log.d(TAG, "Item: " + item.toString()); 
      String page = item.toString(); 
      String pageFinal = page + ".class"; 
      Toast.makeText(getActivity(), item.toString(), 
        Toast.LENGTH_LONG).show(); 

      Class<?> c = null; 
      if(pageFinal != null) { 
       try { 
        c = Class.forName(pageFinal); 
       } catch (ClassNotFoundException e) { 
        e.printStackTrace(); 
       } 
      } 
      Intent intent = new Intent(getActivity(), c); 
      getActivity().startActivity(intent); 

     } 

日誌:

03-07 08:42:19.872 18138-18138/ro.vrt.videoplayerstreaming W/System.err:   Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available 
03-07 08:42:19.872 18138-18138/ro.vrt.videoplayerstreaming D/AndroidRuntime: Shutting down VM 
03-07 08:42:19.872 18138-18138/ro.vrt.videoplayerstreaming E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: ro.vrt.videoplayerstreaming, PID: 18138 
                      java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Class.getName()' on a null object reference 
                       at android.content.ComponentName.<init>(ComponentName.java:129) 
                       at android.content.Intent.<init>(Intent.java:4449) 
                       at ro.vrt.videoplayerstreaming.MainFragment$ItemViewClickedListener.onItemClicked(MainFragment.java:71) 
                       at android.support.v17.leanback.widget.ListRowPresenter$ListRowPresenterItemBridgeAdapter$1.onClick(ListRowPresenter.java:243) 
                       at android.view.View.performClick(View.java:5198) 
                       at android.view.View$PerformClick.run(View.java:21147) 
                       at android.os.Handler.handleCallback(Handler.java:739) 
                       at android.os.Handler.dispatchMessage(Handler.java:95) 
                       at android.os.Looper.loop(Looper.java:148) 
                       at android.app.ActivityThread.main(ActivityThread.java:5417) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
03-07 08:42:22.304 18138-18138/ro.vrt.videoplayerstreaming I/Process: Sending signal. PID: 18138 SIG: 9 

編輯:

Movie.java

public class Movie { 

private static final String TAG = Movie.class.getSimpleName(); 

static final long serialVersionUID = 727566175075960653L; 
private long id; 
private String title; 
private String studio; 
private String description; 
private String cardImageUrl; 

public String getCardImageUrl() { 
    return cardImageUrl; 
} 

public void setCardImageUrl(String cardImageUrl) { 
    this.cardImageUrl = cardImageUrl; 
} 
public Movie() { 
} 
public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 
public long getId() { 
    return id; 
} 

public void setId(long id) { 
    this.id = id; 
} 

public String getTitle() { 
    return title; 
} 

public void setTitle(String title) { 
    this.title = title; 
} 

public String getStudio() { 
    return studio; 
} 

public void setStudio(String studio) { 
    this.studio = studio; 
} 

@Override 
public String toString() { 
    /* 
    return "Movie{" + 
      "id=" + id + 
      ", title='" + title + '\'' + 
      '}'; 
      */ 
    return title; 
} 
public URI getCardImageURI() { 
    try { 
     return new URI(getCardImageUrl()); 
    } catch (URISyntaxException e) { 
     return null; 
    } 
} 

}

+0

如何創建一個Movie實例?發佈電影對象的內容。 –

+0

Movie.java已結束。 –

+0

添加創建新Movie實例的代碼。 –

回答

5

當您使用Class.forName(className)方法,className必須從你的包的名字和你的名字Class沒有.class擴展構造。

對於ro.movieapp.activities.MovieActivity.class你的電話應該是這樣的:Class.forName("ro.movieapp.activities.MovieActivity")。這就是說,這是一個非常糟糕的主意,因爲它是一個簡單的bug源(你的問題就是一個很好的例子)。您應該在Movie對象內保留對您的活動Class的引用。

我的建議是做這樣的事情:

class Movie { 

    private Class<?> activityClass; 

    public <C extends AppCompatActivity> void setActivityClass(Class<C> activityClass) { 
     this.activityClass = activityClass; 
    } 

    @SuppressWarnings("unchecked") 
    public <C extends AppCompatActivity> Class<C> getActivityClass() { 
     return (Class<C>) activityClass; 
    } 
} 

... 

final Movie movie = new Movie(); 
movie.setActivityClass(MovieActivity.class); 

... 

final Intent intent = new Intent(getActivity(), movie.getActivityClass()); 
startActivity(intent); 
+0

工作正常。謝謝 –

3

Class.forName方法需要類名參數,它必須是類的完整路徑。

例如,如果你的活動是在包com.example.activity.SampleActivity

則方法應該被稱爲像

Class<?> c=Class.forName("com.example.activity.SampleActivity"); 

確保您從page.toString得到正確的類名()。

+0

我加了這個,現在是工作「com.example.activity。」 –

+1

@diaconuliviu這是一個非常糟糕的主意!這件事是一個很容易出現的錯誤。第一個證明就是你在stackoverflow上問這個問題。推動自己成爲一個更好的軟件開發人員,不要破解你的方式。 –

+0

我不明白你的意思。 –

相關問題